{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**实验目标：**\n",
    "\n",
    "通过本实验，你将深入了解和实践说话人识别技术，并掌握利用声音特征进行有效说话人识别的基本方法，了解不同特征和模型对识别准确率的影响。\n",
    "\n",
    "实验的核心目标是使用TIMIT数据集来训练一个说话人识别系统，涵盖数据预处理、特征提取、模型训练和评估等关键步骤。\n",
    "\n",
    "\n",
    "**实验方法：**\n",
    "\n",
    "**1. 数据预处理和划分(可选)：**\n",
    "  - 为了方便大家，我们提供了划分好的TIMIT数据集结构，当然你也可以根据训练结果自行划分该原数据集。\n",
    "  - 原数据集下载地址：https://drive.google.com/file/d/180mSIiXN9RVDV2Xn1xcWNkMRm5J5MjN4/view?usp=sharing\n",
    "  - 我们排除了SA的两个方言句子，并在剩余的8个句子中选取了SX的5个句子和SI的1个句子作为训练集，SI的另外2个句子作为测试集。\n",
    "  \n",
    "**2. 特征提取：**\n",
    "  - 学习并实现包括但不限于MFCC特征等特征的提取，探索声音信号的频率和时间特性。\n",
    "  - 鼓励尝试和比较其他特征提取方法，例如LPCC或声谱图特征，以理解不同特征对识别性能的影响。\n",
    "  \n",
    "**3. 模型选择和训练：**\n",
    "  - 探索并选择适合的分类器和模型进行说话人识别，如GMM、Softmax分类器或深度学习模型。\n",
    "  - 实现模型训练流程，使用训练集数据训练模型。\n",
    "  \n",
    "**4. 评估和分析：**\n",
    "  - 使用准确率作为主要的评价指标在测试集上评估模型性能。\n",
    "  - 对比不同特征和模型的性能，分析其对说话人识别准确率的影响。\n",
    "  - 可视化不同模型的识别结果和错误率，讨论可能的改进方法。\n",
    "\n",
    "**实验要求：**\n",
    "  - 1.选择并实现至少一种特征的提取，并鼓励尝试其他特征提取方法。\n",
    "  - 2.选择并实现至少一种分类器或模型进行说话人识别，并使用准确率评估指标评估其性能。\n",
    "  - 3.通过实验对比、分析和可视化，撰写详细的实验报告，包括实验目的、实验方法、结果分析和结论。\n",
    "  - 4.实验报告应以清晰、逻辑性强的形式呈现，图表和结果应清楚明了。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 实验准备"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "## 导入必要的库\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn import metrics\n",
    "import os \n",
    "import librosa\n",
    "from sklearn.mixture import GaussianMixture\n",
    "import pickle\n",
    "import torch\n",
    "import torch.nn.functional as F\n",
    "from tqdm import tqdm\n",
    "import matplotlib.pyplot as plt\n",
    "from visualize import *\n",
    "# 可以根据需要导入其他库，比如librosa用于音频处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 数据预处理(加载数据集)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据加载\n",
    "from dataset import TIMITDataset\n",
    "data_dir = r'E:\\py_code\\voice-processing\\experiment2\\Dataset'\n",
    "train_data = TIMITDataset(data_dir)\n",
    "test_data = TIMITDataset(data_dir,split='test')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([387, 24])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_data[0][1][0].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['FCJF0',\n",
       " 'FDAW0',\n",
       " 'FDML0',\n",
       " 'FECD0',\n",
       " 'FETB0',\n",
       " 'FJSP0',\n",
       " 'FKFB0',\n",
       " 'FMEM0',\n",
       " 'FSAH0',\n",
       " 'FSJK1',\n",
       " 'FSMA0',\n",
       " 'FTBR0',\n",
       " 'FVFB0',\n",
       " 'FVMH0',\n",
       " 'MCPM0',\n",
       " 'MDAC0',\n",
       " 'MDPK0',\n",
       " 'MEDR0',\n",
       " 'MGRL0',\n",
       " 'MJEB1',\n",
       " 'MJWT0',\n",
       " 'MKLS0',\n",
       " 'MKLW0',\n",
       " 'MMGG0',\n",
       " 'MMRP0',\n",
       " 'MPGH0',\n",
       " 'MPGR0',\n",
       " 'MPSW0',\n",
       " 'MRAI0',\n",
       " 'MRCG0',\n",
       " 'MRDD0',\n",
       " 'MRSO0',\n",
       " 'MRWS0',\n",
       " 'MTJS0',\n",
       " 'MTPF0',\n",
       " 'MTRR0',\n",
       " 'MWAD0',\n",
       " 'MWAR0',\n",
       " 'FAEM0',\n",
       " 'FAJW0',\n",
       " 'FCAJ0',\n",
       " 'FCMM0',\n",
       " 'FCYL0',\n",
       " 'FDAS1',\n",
       " 'FDNC0',\n",
       " 'FDXW0',\n",
       " 'FEAC0',\n",
       " 'FHLM0',\n",
       " 'FJKL0',\n",
       " 'FKAA0',\n",
       " 'FLMA0',\n",
       " 'FLMC0',\n",
       " 'FMJB0',\n",
       " 'FMKF0',\n",
       " 'FMMH0',\n",
       " 'FPJF0',\n",
       " 'FRLL0',\n",
       " 'FSCN0',\n",
       " 'FSKL0',\n",
       " 'FSRH0',\n",
       " 'FTMG0',\n",
       " 'MARC0',\n",
       " 'MBJV0',\n",
       " 'MCEW0',\n",
       " 'MCTM0',\n",
       " 'MDBP0',\n",
       " 'MDEM0',\n",
       " 'MDLB0',\n",
       " 'MDLC2',\n",
       " 'MDMT0',\n",
       " 'MDPS0',\n",
       " 'MDSS0',\n",
       " 'MDWD0',\n",
       " 'MEFG0',\n",
       " 'MHRM0',\n",
       " 'MJAE0',\n",
       " 'MJBG0',\n",
       " 'MJDE0',\n",
       " 'MJEB0',\n",
       " 'MJHI0',\n",
       " 'MJMA0',\n",
       " 'MJMD0',\n",
       " 'MJPM0',\n",
       " 'MJRP0',\n",
       " 'MKAH0',\n",
       " 'MKAJ0',\n",
       " 'MKDT0',\n",
       " 'MKJO0',\n",
       " 'MMAA0',\n",
       " 'MMAG0',\n",
       " 'MMDS0',\n",
       " 'MMGK0',\n",
       " 'MMXS0',\n",
       " 'MPPC0',\n",
       " 'MPRB0',\n",
       " 'MRAB0',\n",
       " 'MRCW0',\n",
       " 'MRFK0',\n",
       " 'MRGS0',\n",
       " 'MRHL0',\n",
       " 'MRJH0',\n",
       " 'MRJM0',\n",
       " 'MRJM1',\n",
       " 'MRJT0',\n",
       " 'MRLJ0',\n",
       " 'MRLR0',\n",
       " 'MRMS0',\n",
       " 'MSAT0',\n",
       " 'MTAT1',\n",
       " 'MTBC0',\n",
       " 'MTDB0',\n",
       " 'MTJG0',\n",
       " 'MWSB0',\n",
       " 'MZMB0',\n",
       " 'FALK0',\n",
       " 'FCKE0',\n",
       " 'FCMG0',\n",
       " 'FDFB0',\n",
       " 'FDJH0',\n",
       " 'FEME0',\n",
       " 'FGCS0',\n",
       " 'FGRW0',\n",
       " 'FJLG0',\n",
       " 'FJLR0',\n",
       " 'FLAC0',\n",
       " 'FLJD0',\n",
       " 'FLTM0',\n",
       " 'FMJF0',\n",
       " 'FNTB0',\n",
       " 'FPAZ0',\n",
       " 'FSJS0',\n",
       " 'FSJW0',\n",
       " 'FSKC0',\n",
       " 'FSLS0',\n",
       " 'MADC0',\n",
       " 'MAKB0',\n",
       " 'MAKR0',\n",
       " 'MAPV0',\n",
       " 'MBEF0',\n",
       " 'MCAL0',\n",
       " 'MCDC0',\n",
       " 'MCDD0',\n",
       " 'MCEF0',\n",
       " 'MDBB1',\n",
       " 'MDDC0',\n",
       " 'MDEF0',\n",
       " 'MDHS0',\n",
       " 'MDJM0',\n",
       " 'MDLC0',\n",
       " 'MDLH0',\n",
       " 'MDNS0',\n",
       " 'MDSS1',\n",
       " 'MDTB0',\n",
       " 'MDWM0',\n",
       " 'MFMC0',\n",
       " 'MGAF0',\n",
       " 'MHJB0',\n",
       " 'MHMR0',\n",
       " 'MILB0',\n",
       " 'MJDA0',\n",
       " 'MJJB0',\n",
       " 'MJKR0',\n",
       " 'MJLG1',\n",
       " 'MJRH1',\n",
       " 'MKLS1',\n",
       " 'MKXL0',\n",
       " 'MLNS0',\n",
       " 'MMAM0',\n",
       " 'MMAR0',\n",
       " 'MMEB0',\n",
       " 'MMJB1',\n",
       " 'MMSM0',\n",
       " 'MPRD0',\n",
       " 'MRBC0',\n",
       " 'MRDS0',\n",
       " 'MREE0',\n",
       " 'MREH1',\n",
       " 'MRJB1',\n",
       " 'MRTC0',\n",
       " 'MRTJ0',\n",
       " 'MRWA0',\n",
       " 'MSFV0',\n",
       " 'MTJM0',\n",
       " 'MTKP0',\n",
       " 'MTLB0',\n",
       " 'MTPG0',\n",
       " 'MTPP0',\n",
       " 'MVJH0',\n",
       " 'MWDK0',\n",
       " 'MWGR0',\n",
       " 'FALR0',\n",
       " 'FBAS0',\n",
       " 'FBMJ0',\n",
       " 'FCAG0',\n",
       " 'FDKN0',\n",
       " 'FEEH0',\n",
       " 'FJWB1',\n",
       " 'FJXP0',\n",
       " 'FKDW0',\n",
       " 'FKLC0',\n",
       " 'FLHD0',\n",
       " 'FLKM0',\n",
       " 'FPAF0',\n",
       " 'FSAK0',\n",
       " 'FSSB0',\n",
       " 'MAEB0',\n",
       " 'MARW0',\n",
       " 'MBMA0',\n",
       " 'MBWP0',\n",
       " 'MCDR0',\n",
       " 'MCSS0',\n",
       " 'MDCD0',\n",
       " 'MDMA0',\n",
       " 'MESG0',\n",
       " 'MFRM0',\n",
       " 'MFWK0',\n",
       " 'MGAG0',\n",
       " 'MGJC0',\n",
       " 'MGRP0',\n",
       " 'MGXP0',\n",
       " 'MJAC0',\n",
       " 'MJDC0',\n",
       " 'MJEE0',\n",
       " 'MJJJ0',\n",
       " 'MJLB0',\n",
       " 'MJLS0',\n",
       " 'MJMM0',\n",
       " 'MJPM1',\n",
       " 'MJRH0',\n",
       " 'MJSR0',\n",
       " 'MJWS0',\n",
       " 'MJXL0',\n",
       " 'MKAM0',\n",
       " 'MLBC0',\n",
       " 'MLEL0',\n",
       " 'MLJC0',\n",
       " 'MLJH0',\n",
       " 'MLSH0',\n",
       " 'MMBS0',\n",
       " 'MMDM0',\n",
       " 'MMGC0',\n",
       " 'MNET0',\n",
       " 'MPEB0',\n",
       " 'MPRK0',\n",
       " 'MPRT0',\n",
       " 'MRAB1',\n",
       " 'MRFL0',\n",
       " 'MRGM0',\n",
       " 'MRSP0',\n",
       " 'MSFH0',\n",
       " 'MSMC0',\n",
       " 'MSMS0',\n",
       " 'MSRG0',\n",
       " 'MSTF0',\n",
       " 'MTAS0',\n",
       " 'MTQC0',\n",
       " 'MTRC0',\n",
       " 'MTRT0',\n",
       " 'FBJL0',\n",
       " 'FBMH0',\n",
       " 'FCDR1',\n",
       " 'FDMY0',\n",
       " 'FDTD0',\n",
       " 'FEAR0',\n",
       " 'FEXM0',\n",
       " 'FGDP0',\n",
       " 'FGMB0',\n",
       " 'FJXM0',\n",
       " 'FKKH0',\n",
       " 'FLJA0',\n",
       " 'FLJG0',\n",
       " 'FLMK0',\n",
       " 'FLOD0',\n",
       " 'FMPG0',\n",
       " 'FPMY0',\n",
       " 'FSAG0',\n",
       " 'FSDC0',\n",
       " 'FSJG0',\n",
       " 'FSKP0',\n",
       " 'FSMM0',\n",
       " 'FSMS1',\n",
       " 'FTBW0',\n",
       " 'FTLG0',\n",
       " 'MBGT0',\n",
       " 'MCHL0',\n",
       " 'MCLM0',\n",
       " 'MDAS0',\n",
       " 'MDHL0',\n",
       " 'MDSJ0',\n",
       " 'MDWH0',\n",
       " 'MEGJ0',\n",
       " 'MEWM0',\n",
       " 'MFER0',\n",
       " 'MGES0',\n",
       " 'MGSH0',\n",
       " 'MHIT0',\n",
       " 'MHMG0',\n",
       " 'MJDM0',\n",
       " 'MJFH0',\n",
       " 'MJPG0',\n",
       " 'MJRG0',\n",
       " 'MJWG0',\n",
       " 'MJXA0',\n",
       " 'MMAB1',\n",
       " 'MMCC0',\n",
       " 'MMDM1',\n",
       " 'MMVP0',\n",
       " 'MMWB0',\n",
       " 'MPMB0',\n",
       " 'MRAM0',\n",
       " 'MRAV0',\n",
       " 'MREW1',\n",
       " 'MRKM0',\n",
       " 'MRLD0',\n",
       " 'MRML0',\n",
       " 'MRVG0',\n",
       " 'MSAS0',\n",
       " 'MSDH0',\n",
       " 'MSEM1',\n",
       " 'MSRR0',\n",
       " 'MTAT0',\n",
       " 'MTDP0',\n",
       " 'MTMT0',\n",
       " 'MVLO0',\n",
       " 'MWAC0',\n",
       " 'MWCH0',\n",
       " 'MWEM0',\n",
       " 'MWSH0',\n",
       " 'FAPB0',\n",
       " 'FBCH0',\n",
       " 'FHXS0',\n",
       " 'FJDM2',\n",
       " 'FKLC1',\n",
       " 'FLAG0',\n",
       " 'FMJU0',\n",
       " 'FPAD0',\n",
       " 'FRJB0',\n",
       " 'FSBK0',\n",
       " 'FSDJ0',\n",
       " 'FSGF0',\n",
       " 'FTAJ0',\n",
       " 'MABC0',\n",
       " 'MAJP0',\n",
       " 'MBMA1',\n",
       " 'MCAE0',\n",
       " 'MDRD0',\n",
       " 'MEAL0',\n",
       " 'MEJL0',\n",
       " 'MESJ0',\n",
       " 'MJRK0',\n",
       " 'MKES0',\n",
       " 'MKLN0',\n",
       " 'MMDB0',\n",
       " 'MPGR1',\n",
       " 'MRMB0',\n",
       " 'MRXB0',\n",
       " 'MSAT1',\n",
       " 'MSDS0',\n",
       " 'MSJK0',\n",
       " 'MSMR0',\n",
       " 'MSVS0',\n",
       " 'MTJU0',\n",
       " 'MTXS0',\n",
       " 'FBLV0',\n",
       " 'FCJS0',\n",
       " 'FCRZ0',\n",
       " 'FJEN0',\n",
       " 'FJHK0',\n",
       " 'FJRP1',\n",
       " 'FJSK0',\n",
       " 'FKDE0',\n",
       " 'FKSR0',\n",
       " 'FLEH0',\n",
       " 'FLET0',\n",
       " 'FMAH1',\n",
       " 'FMKC0',\n",
       " 'FPAB1',\n",
       " 'FPAC0',\n",
       " 'FREH0',\n",
       " 'FSPM0',\n",
       " 'FVKB0',\n",
       " 'MADD0',\n",
       " 'MAEO0',\n",
       " 'MAFM0',\n",
       " 'MBAR0',\n",
       " 'MBBR0',\n",
       " 'MBML0',\n",
       " 'MBOM0',\n",
       " 'MBTH0',\n",
       " 'MCLK0',\n",
       " 'MCRE0',\n",
       " 'MCTH0',\n",
       " 'MDCM0',\n",
       " 'MDED0',\n",
       " 'MDKS0',\n",
       " 'MDLC1',\n",
       " 'MDLM0',\n",
       " 'MDLR0',\n",
       " 'MDLR1',\n",
       " 'MDPB0',\n",
       " 'MFXS0',\n",
       " 'MFXV0',\n",
       " 'MGAK0',\n",
       " 'MGAR0',\n",
       " 'MGAW0',\n",
       " 'MGSL0',\n",
       " 'MHBS0',\n",
       " 'MHXL0',\n",
       " 'MJAI0',\n",
       " 'MJDG0',\n",
       " 'MJFR0',\n",
       " 'MJJM0',\n",
       " 'MJRA0',\n",
       " 'MKAG0',\n",
       " 'MKDB0',\n",
       " 'MKLR0',\n",
       " 'MMDG0',\n",
       " 'MMWS1',\n",
       " 'MNTW0',\n",
       " 'MPAR0',\n",
       " 'MPFU0',\n",
       " 'MREM0',\n",
       " 'MRLJ1',\n",
       " 'MRMG0',\n",
       " 'MRMH0',\n",
       " 'MRPC1',\n",
       " 'MSAH1',\n",
       " 'MSDB0',\n",
       " 'MSES0',\n",
       " 'MTAB0',\n",
       " 'MTER0',\n",
       " 'MTKD0',\n",
       " 'MTLC0',\n",
       " 'MTML0',\n",
       " 'MTMN0',\n",
       " 'MTPR0',\n",
       " 'MTWH1',\n",
       " 'MVRW0',\n",
       " 'MWRE0',\n",
       " 'MWRP0',\n",
       " 'FBCG1',\n",
       " 'FCEG0',\n",
       " 'FCLT0',\n",
       " 'FJRB0',\n",
       " 'FKLH0',\n",
       " 'FMBG0',\n",
       " 'FNKL0',\n",
       " 'FPLS0',\n",
       " 'MBCG0',\n",
       " 'MBSB0',\n",
       " 'MCXM0',\n",
       " 'MEJS0',\n",
       " 'MKDD0',\n",
       " 'MKRG0',\n",
       " 'MMEA0',\n",
       " 'MMLM0',\n",
       " 'MMPM0',\n",
       " 'MMWS0',\n",
       " 'MRDM0',\n",
       " 'MRLK0',\n",
       " 'MRRE0',\n",
       " 'MTCS0']"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_data.speakers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. 特征提取"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. 模型选择和训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "## 在这部分，你可以选择不同的分类器和模型如GMM模型来进行实验\n",
    "# GMM模型\n",
    "def train(n_components):\n",
    "    # n_components:混合高斯模型中的分布个数\n",
    "    for i,data in enumerate(train_data):\n",
    "        module_path = os.path.join('module',train_data.speaker_wavs[i][0].split('\\\\')[-2])\n",
    "        voice = np.concatenate(data[1])\n",
    "        gmm = GaussianMixture(n_components=n_components)\n",
    "        gmm.fit(voice)\n",
    "        try: \n",
    "            os.makedirs(module_path)\n",
    "        except:\n",
    "            pass\n",
    "        with open(os.path.join(module_path,f'gmm{i}_model.pkl'), 'wb') as f:\n",
    "            pickle.dump(gmm, f)\n",
    "        # print(f'训练第{i}人结束')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def predict(voice):\n",
    "    module_path = r'module'\n",
    "    result = []\n",
    "    idx_cls = os.listdir(module_path)\n",
    "    for pkl_path in idx_cls:\n",
    "        p = os.path.join(module_path,pkl_path)\n",
    "        with open(os.path.join(p,os.listdir(p)[0]),'rb') as file:\n",
    "            load_model = pickle.load(file)\n",
    "        result.append(load_model.score(voice))\n",
    "    return idx_cls[F.softmax(torch.tensor(result),dim=0).argmax()]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. 评价指标(准确率Accuracy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "## 请编写代码或使用库函数accuracy_score计算测试集上的准确率Accuracy\n",
    "def valid():\n",
    "    labels = []\n",
    "    pre_values = []\n",
    "    for i,datas in enumerate(tqdm(test_data)):\n",
    "        result_true = test_data.speaker_wavs[i][0].split('\\\\')[-2]\n",
    "        for voice in datas[1]:\n",
    "            labels.append(test_data.speakers.index(result_true))\n",
    "            result_pre = predict(voice)\n",
    "            pre_values.append(test_data.speakers.index(result_pre))\n",
    "    return labels,pre_values\n",
    "# valid()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 462/462 [06:24<00:00,  1.20it/s]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.9588744588744589"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train(4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 462/462 [06:30<00:00,  1.18it/s]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(924, 924)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "labels,pre_values = valid()\n",
    "len(labels),len(pre_values)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  6. 分析和可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "e:\\anaconda\\envs\\voice\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1509: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
      "e:\\anaconda\\envs\\voice\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1509: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
      "e:\\anaconda\\envs\\voice\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1509: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n"
     ]
    }
   ],
   "source": [
    "test_report,confuse_matrix = evaluate(pre_values,labels,test_data.speakers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "       FCJF0       1.00      1.00      1.00         2\n",
      "       FDAW0       1.00      1.00      1.00         2\n",
      "       FDML0       1.00      1.00      1.00         2\n",
      "       FECD0       1.00      1.00      1.00         2\n",
      "       FETB0       1.00      1.00      1.00         2\n",
      "       FJSP0       1.00      1.00      1.00         2\n",
      "       FKFB0       1.00      1.00      1.00         2\n",
      "       FMEM0       1.00      0.50      0.67         2\n",
      "       FSAH0       1.00      1.00      1.00         2\n",
      "       FSJK1       1.00      1.00      1.00         2\n",
      "       FSMA0       1.00      1.00      1.00         2\n",
      "       FTBR0       1.00      1.00      1.00         2\n",
      "       FVFB0       1.00      1.00      1.00         2\n",
      "       FVMH0       1.00      1.00      1.00         2\n",
      "       MCPM0       1.00      1.00      1.00         2\n",
      "       MDAC0       0.67      1.00      0.80         2\n",
      "       MDPK0       1.00      1.00      1.00         2\n",
      "       MEDR0       1.00      1.00      1.00         2\n",
      "       MGRL0       1.00      1.00      1.00         2\n",
      "       MJEB1       0.00      0.00      0.00         2\n",
      "       MJWT0       1.00      1.00      1.00         2\n",
      "       MKLS0       1.00      1.00      1.00         2\n",
      "       MKLW0       1.00      1.00      1.00         2\n",
      "       MMGG0       1.00      1.00      1.00         2\n",
      "       MMRP0       0.50      0.50      0.50         2\n",
      "       MPGH0       1.00      1.00      1.00         2\n",
      "       MPGR0       1.00      1.00      1.00         2\n",
      "       MPSW0       1.00      1.00      1.00         2\n",
      "       MRAI0       1.00      1.00      1.00         2\n",
      "       MRCG0       1.00      1.00      1.00         2\n",
      "       MRDD0       1.00      1.00      1.00         2\n",
      "       MRSO0       1.00      1.00      1.00         2\n",
      "       MRWS0       1.00      1.00      1.00         2\n",
      "       MTJS0       1.00      1.00      1.00         2\n",
      "       MTPF0       1.00      1.00      1.00         2\n",
      "       MTRR0       1.00      1.00      1.00         2\n",
      "       MWAD0       1.00      1.00      1.00         2\n",
      "       MWAR0       1.00      1.00      1.00         2\n",
      "       FAEM0       1.00      0.50      0.67         2\n",
      "       FAJW0       1.00      1.00      1.00         2\n",
      "       FCAJ0       1.00      1.00      1.00         2\n",
      "       FCMM0       1.00      1.00      1.00         2\n",
      "       FCYL0       1.00      1.00      1.00         2\n",
      "       FDAS1       1.00      1.00      1.00         2\n",
      "       FDNC0       1.00      1.00      1.00         2\n",
      "       FDXW0       1.00      1.00      1.00         2\n",
      "       FEAC0       1.00      1.00      1.00         2\n",
      "       FHLM0       1.00      1.00      1.00         2\n",
      "       FJKL0       0.67      1.00      0.80         2\n",
      "       FKAA0       1.00      1.00      1.00         2\n",
      "       FLMA0       1.00      1.00      1.00         2\n",
      "       FLMC0       1.00      1.00      1.00         2\n",
      "       FMJB0       1.00      1.00      1.00         2\n",
      "       FMKF0       1.00      1.00      1.00         2\n",
      "       FMMH0       1.00      1.00      1.00         2\n",
      "       FPJF0       1.00      1.00      1.00         2\n",
      "       FRLL0       0.67      1.00      0.80         2\n",
      "       FSCN0       1.00      1.00      1.00         2\n",
      "       FSKL0       1.00      1.00      1.00         2\n",
      "       FSRH0       1.00      1.00      1.00         2\n",
      "       FTMG0       1.00      1.00      1.00         2\n",
      "       MARC0       1.00      1.00      1.00         2\n",
      "       MBJV0       1.00      1.00      1.00         2\n",
      "       MCEW0       1.00      1.00      1.00         2\n",
      "       MCTM0       1.00      1.00      1.00         2\n",
      "       MDBP0       1.00      1.00      1.00         2\n",
      "       MDEM0       1.00      1.00      1.00         2\n",
      "       MDLB0       1.00      0.50      0.67         2\n",
      "       MDLC2       1.00      1.00      1.00         2\n",
      "       MDMT0       0.00      0.00      0.00         2\n",
      "       MDPS0       1.00      1.00      1.00         2\n",
      "       MDSS0       1.00      1.00      1.00         2\n",
      "       MDWD0       1.00      1.00      1.00         2\n",
      "       MEFG0       1.00      1.00      1.00         2\n",
      "       MHRM0       1.00      1.00      1.00         2\n",
      "       MJAE0       1.00      1.00      1.00         2\n",
      "       MJBG0       1.00      0.50      0.67         2\n",
      "       MJDE0       1.00      0.50      0.67         2\n",
      "       MJEB0       1.00      1.00      1.00         2\n",
      "       MJHI0       1.00      1.00      1.00         2\n",
      "       MJMA0       1.00      1.00      1.00         2\n",
      "       MJMD0       1.00      1.00      1.00         2\n",
      "       MJPM0       1.00      1.00      1.00         2\n",
      "       MJRP0       1.00      1.00      1.00         2\n",
      "       MKAH0       1.00      1.00      1.00         2\n",
      "       MKAJ0       1.00      1.00      1.00         2\n",
      "       MKDT0       1.00      1.00      1.00         2\n",
      "       MKJO0       1.00      1.00      1.00         2\n",
      "       MMAA0       1.00      0.50      0.67         2\n",
      "       MMAG0       1.00      1.00      1.00         2\n",
      "       MMDS0       1.00      1.00      1.00         2\n",
      "       MMGK0       1.00      1.00      1.00         2\n",
      "       MMXS0       1.00      1.00      1.00         2\n",
      "       MPPC0       1.00      1.00      1.00         2\n",
      "       MPRB0       1.00      1.00      1.00         2\n",
      "       MRAB0       1.00      1.00      1.00         2\n",
      "       MRCW0       1.00      1.00      1.00         2\n",
      "       MRFK0       1.00      1.00      1.00         2\n",
      "       MRGS0       1.00      1.00      1.00         2\n",
      "       MRHL0       1.00      1.00      1.00         2\n",
      "       MRJH0       1.00      0.50      0.67         2\n",
      "       MRJM0       1.00      1.00      1.00         2\n",
      "       MRJM1       1.00      1.00      1.00         2\n",
      "       MRJT0       1.00      1.00      1.00         2\n",
      "       MRLJ0       1.00      1.00      1.00         2\n",
      "       MRLR0       1.00      1.00      1.00         2\n",
      "       MRMS0       1.00      1.00      1.00         2\n",
      "       MSAT0       1.00      1.00      1.00         2\n",
      "       MTAT1       1.00      1.00      1.00         2\n",
      "       MTBC0       1.00      1.00      1.00         2\n",
      "       MTDB0       1.00      1.00      1.00         2\n",
      "       MTJG0       1.00      1.00      1.00         2\n",
      "       MWSB0       1.00      1.00      1.00         2\n",
      "       MZMB0       1.00      1.00      1.00         2\n",
      "       FALK0       1.00      1.00      1.00         2\n",
      "       FCKE0       1.00      1.00      1.00         2\n",
      "       FCMG0       1.00      1.00      1.00         2\n",
      "       FDFB0       1.00      1.00      1.00         2\n",
      "       FDJH0       0.00      0.00      0.00         2\n",
      "       FEME0       1.00      1.00      1.00         2\n",
      "       FGCS0       1.00      1.00      1.00         2\n",
      "       FGRW0       1.00      1.00      1.00         2\n",
      "       FJLG0       1.00      1.00      1.00         2\n",
      "       FJLR0       1.00      1.00      1.00         2\n",
      "       FLAC0       0.00      0.00      0.00         2\n",
      "       FLJD0       1.00      0.50      0.67         2\n",
      "       FLTM0       1.00      1.00      1.00         2\n",
      "       FMJF0       0.18      1.00      0.31         2\n",
      "       FNTB0       1.00      1.00      1.00         2\n",
      "       FPAZ0       0.67      1.00      0.80         2\n",
      "       FSJS0       1.00      0.50      0.67         2\n",
      "       FSJW0       1.00      1.00      1.00         2\n",
      "       FSKC0       1.00      1.00      1.00         2\n",
      "       FSLS0       1.00      1.00      1.00         2\n",
      "       MADC0       1.00      0.50      0.67         2\n",
      "       MAKB0       1.00      1.00      1.00         2\n",
      "       MAKR0       1.00      1.00      1.00         2\n",
      "       MAPV0       1.00      1.00      1.00         2\n",
      "       MBEF0       1.00      1.00      1.00         2\n",
      "       MCAL0       1.00      1.00      1.00         2\n",
      "       MCDC0       1.00      1.00      1.00         2\n",
      "       MCDD0       1.00      1.00      1.00         2\n",
      "       MCEF0       1.00      1.00      1.00         2\n",
      "       MDBB1       1.00      1.00      1.00         2\n",
      "       MDDC0       1.00      1.00      1.00         2\n",
      "       MDEF0       1.00      1.00      1.00         2\n",
      "       MDHS0       1.00      1.00      1.00         2\n",
      "       MDJM0       1.00      1.00      1.00         2\n",
      "       MDLC0       1.00      1.00      1.00         2\n",
      "       MDLH0       1.00      1.00      1.00         2\n",
      "       MDNS0       1.00      1.00      1.00         2\n",
      "       MDSS1       1.00      1.00      1.00         2\n",
      "       MDTB0       1.00      1.00      1.00         2\n",
      "       MDWM0       1.00      1.00      1.00         2\n",
      "       MFMC0       1.00      1.00      1.00         2\n",
      "       MGAF0       1.00      1.00      1.00         2\n",
      "       MHJB0       1.00      1.00      1.00         2\n",
      "       MHMR0       0.67      1.00      0.80         2\n",
      "       MILB0       1.00      1.00      1.00         2\n",
      "       MJDA0       1.00      1.00      1.00         2\n",
      "       MJJB0       1.00      1.00      1.00         2\n",
      "       MJKR0       1.00      1.00      1.00         2\n",
      "       MJLG1       1.00      0.50      0.67         2\n",
      "       MJRH1       1.00      1.00      1.00         2\n",
      "       MKLS1       1.00      1.00      1.00         2\n",
      "       MKXL0       1.00      1.00      1.00         2\n",
      "       MLNS0       1.00      1.00      1.00         2\n",
      "       MMAM0       1.00      1.00      1.00         2\n",
      "       MMAR0       1.00      1.00      1.00         2\n",
      "       MMEB0       1.00      1.00      1.00         2\n",
      "       MMJB1       1.00      1.00      1.00         2\n",
      "       MMSM0       1.00      1.00      1.00         2\n",
      "       MPRD0       1.00      1.00      1.00         2\n",
      "       MRBC0       1.00      1.00      1.00         2\n",
      "       MRDS0       1.00      1.00      1.00         2\n",
      "       MREE0       1.00      1.00      1.00         2\n",
      "       MREH1       0.50      1.00      0.67         2\n",
      "       MRJB1       1.00      1.00      1.00         2\n",
      "       MRTC0       1.00      1.00      1.00         2\n",
      "       MRTJ0       1.00      1.00      1.00         2\n",
      "       MRWA0       1.00      1.00      1.00         2\n",
      "       MSFV0       1.00      1.00      1.00         2\n",
      "       MTJM0       1.00      1.00      1.00         2\n",
      "       MTKP0       1.00      1.00      1.00         2\n",
      "       MTLB0       1.00      1.00      1.00         2\n",
      "       MTPG0       1.00      1.00      1.00         2\n",
      "       MTPP0       1.00      1.00      1.00         2\n",
      "       MVJH0       1.00      1.00      1.00         2\n",
      "       MWDK0       1.00      1.00      1.00         2\n",
      "       MWGR0       1.00      1.00      1.00         2\n",
      "       FALR0       1.00      1.00      1.00         2\n",
      "       FBAS0       1.00      1.00      1.00         2\n",
      "       FBMJ0       1.00      1.00      1.00         2\n",
      "       FCAG0       1.00      1.00      1.00         2\n",
      "       FDKN0       1.00      1.00      1.00         2\n",
      "       FEEH0       1.00      1.00      1.00         2\n",
      "       FJWB1       1.00      1.00      1.00         2\n",
      "       FJXP0       1.00      1.00      1.00         2\n",
      "       FKDW0       1.00      1.00      1.00         2\n",
      "       FKLC0       1.00      1.00      1.00         2\n",
      "       FLHD0       1.00      1.00      1.00         2\n",
      "       FLKM0       1.00      1.00      1.00         2\n",
      "       FPAF0       1.00      1.00      1.00         2\n",
      "       FSAK0       1.00      1.00      1.00         2\n",
      "       FSSB0       1.00      1.00      1.00         2\n",
      "       MAEB0       1.00      1.00      1.00         2\n",
      "       MARW0       1.00      1.00      1.00         2\n",
      "       MBMA0       1.00      1.00      1.00         2\n",
      "       MBWP0       1.00      1.00      1.00         2\n",
      "       MCDR0       1.00      1.00      1.00         2\n",
      "       MCSS0       1.00      1.00      1.00         2\n",
      "       MDCD0       1.00      1.00      1.00         2\n",
      "       MDMA0       1.00      1.00      1.00         2\n",
      "       MESG0       1.00      1.00      1.00         2\n",
      "       MFRM0       1.00      0.50      0.67         2\n",
      "       MFWK0       1.00      1.00      1.00         2\n",
      "       MGAG0       1.00      1.00      1.00         2\n",
      "       MGJC0       1.00      1.00      1.00         2\n",
      "       MGRP0       1.00      1.00      1.00         2\n",
      "       MGXP0       1.00      1.00      1.00         2\n",
      "       MJAC0       1.00      1.00      1.00         2\n",
      "       MJDC0       1.00      1.00      1.00         2\n",
      "       MJEE0       1.00      1.00      1.00         2\n",
      "       MJJJ0       0.67      1.00      0.80         2\n",
      "       MJLB0       1.00      1.00      1.00         2\n",
      "       MJLS0       1.00      1.00      1.00         2\n",
      "       MJMM0       1.00      1.00      1.00         2\n",
      "       MJPM1       0.67      1.00      0.80         2\n",
      "       MJRH0       0.67      1.00      0.80         2\n",
      "       MJSR0       1.00      1.00      1.00         2\n",
      "       MJWS0       1.00      1.00      1.00         2\n",
      "       MJXL0       1.00      1.00      1.00         2\n",
      "       MKAM0       1.00      1.00      1.00         2\n",
      "       MLBC0       1.00      1.00      1.00         2\n",
      "       MLEL0       0.67      1.00      0.80         2\n",
      "       MLJC0       1.00      1.00      1.00         2\n",
      "       MLJH0       1.00      1.00      1.00         2\n",
      "       MLSH0       1.00      1.00      1.00         2\n",
      "       MMBS0       1.00      1.00      1.00         2\n",
      "       MMDM0       1.00      1.00      1.00         2\n",
      "       MMGC0       1.00      1.00      1.00         2\n",
      "       MNET0       1.00      1.00      1.00         2\n",
      "       MPEB0       1.00      1.00      1.00         2\n",
      "       MPRK0       1.00      1.00      1.00         2\n",
      "       MPRT0       1.00      1.00      1.00         2\n",
      "       MRAB1       1.00      1.00      1.00         2\n",
      "       MRFL0       1.00      1.00      1.00         2\n",
      "       MRGM0       1.00      1.00      1.00         2\n",
      "       MRSP0       1.00      1.00      1.00         2\n",
      "       MSFH0       1.00      1.00      1.00         2\n",
      "       MSMC0       1.00      1.00      1.00         2\n",
      "       MSMS0       1.00      1.00      1.00         2\n",
      "       MSRG0       1.00      1.00      1.00         2\n",
      "       MSTF0       1.00      1.00      1.00         2\n",
      "       MTAS0       1.00      1.00      1.00         2\n",
      "       MTQC0       1.00      0.50      0.67         2\n",
      "       MTRC0       1.00      1.00      1.00         2\n",
      "       MTRT0       1.00      1.00      1.00         2\n",
      "       FBJL0       1.00      1.00      1.00         2\n",
      "       FBMH0       1.00      1.00      1.00         2\n",
      "       FCDR1       1.00      1.00      1.00         2\n",
      "       FDMY0       1.00      1.00      1.00         2\n",
      "       FDTD0       1.00      1.00      1.00         2\n",
      "       FEAR0       1.00      1.00      1.00         2\n",
      "       FEXM0       0.67      1.00      0.80         2\n",
      "       FGDP0       1.00      1.00      1.00         2\n",
      "       FGMB0       1.00      1.00      1.00         2\n",
      "       FJXM0       1.00      0.50      0.67         2\n",
      "       FKKH0       1.00      1.00      1.00         2\n",
      "       FLJA0       1.00      1.00      1.00         2\n",
      "       FLJG0       1.00      1.00      1.00         2\n",
      "       FLMK0       1.00      1.00      1.00         2\n",
      "       FLOD0       1.00      1.00      1.00         2\n",
      "       FMPG0       1.00      1.00      1.00         2\n",
      "       FPMY0       1.00      1.00      1.00         2\n",
      "       FSAG0       1.00      1.00      1.00         2\n",
      "       FSDC0       1.00      1.00      1.00         2\n",
      "       FSJG0       1.00      1.00      1.00         2\n",
      "       FSKP0       1.00      1.00      1.00         2\n",
      "       FSMM0       1.00      1.00      1.00         2\n",
      "       FSMS1       1.00      1.00      1.00         2\n",
      "       FTBW0       1.00      1.00      1.00         2\n",
      "       FTLG0       1.00      1.00      1.00         2\n",
      "       MBGT0       1.00      1.00      1.00         2\n",
      "       MCHL0       1.00      1.00      1.00         2\n",
      "       MCLM0       1.00      1.00      1.00         2\n",
      "       MDAS0       1.00      1.00      1.00         2\n",
      "       MDHL0       1.00      1.00      1.00         2\n",
      "       MDSJ0       1.00      1.00      1.00         2\n",
      "       MDWH0       1.00      1.00      1.00         2\n",
      "       MEGJ0       1.00      1.00      1.00         2\n",
      "       MEWM0       1.00      1.00      1.00         2\n",
      "       MFER0       1.00      1.00      1.00         2\n",
      "       MGES0       1.00      1.00      1.00         2\n",
      "       MGSH0       1.00      1.00      1.00         2\n",
      "       MHIT0       1.00      1.00      1.00         2\n",
      "       MHMG0       1.00      1.00      1.00         2\n",
      "       MJDM0       1.00      0.50      0.67         2\n",
      "       MJFH0       1.00      1.00      1.00         2\n",
      "       MJPG0       1.00      1.00      1.00         2\n",
      "       MJRG0       1.00      1.00      1.00         2\n",
      "       MJWG0       1.00      1.00      1.00         2\n",
      "       MJXA0       1.00      0.50      0.67         2\n",
      "       MMAB1       1.00      1.00      1.00         2\n",
      "       MMCC0       1.00      1.00      1.00         2\n",
      "       MMDM1       1.00      1.00      1.00         2\n",
      "       MMVP0       1.00      1.00      1.00         2\n",
      "       MMWB0       1.00      1.00      1.00         2\n",
      "       MPMB0       0.20      1.00      0.33         2\n",
      "       MRAM0       1.00      1.00      1.00         2\n",
      "       MRAV0       1.00      1.00      1.00         2\n",
      "       MREW1       1.00      1.00      1.00         2\n",
      "       MRKM0       1.00      1.00      1.00         2\n",
      "       MRLD0       1.00      1.00      1.00         2\n",
      "       MRML0       1.00      1.00      1.00         2\n",
      "       MRVG0       1.00      1.00      1.00         2\n",
      "       MSAS0       1.00      1.00      1.00         2\n",
      "       MSDH0       1.00      1.00      1.00         2\n",
      "       MSEM1       1.00      1.00      1.00         2\n",
      "       MSRR0       1.00      1.00      1.00         2\n",
      "       MTAT0       1.00      1.00      1.00         2\n",
      "       MTDP0       1.00      1.00      1.00         2\n",
      "       MTMT0       1.00      0.50      0.67         2\n",
      "       MVLO0       0.67      1.00      0.80         2\n",
      "       MWAC0       1.00      1.00      1.00         2\n",
      "       MWCH0       1.00      1.00      1.00         2\n",
      "       MWEM0       1.00      0.50      0.67         2\n",
      "       MWSH0       1.00      1.00      1.00         2\n",
      "       FAPB0       1.00      1.00      1.00         2\n",
      "       FBCH0       1.00      0.50      0.67         2\n",
      "       FHXS0       0.00      0.00      0.00         2\n",
      "       FJDM2       1.00      0.50      0.67         2\n",
      "       FKLC1       1.00      1.00      1.00         2\n",
      "       FLAG0       1.00      1.00      1.00         2\n",
      "       FMJU0       1.00      1.00      1.00         2\n",
      "       FPAD0       1.00      0.50      0.67         2\n",
      "       FRJB0       0.50      1.00      0.67         2\n",
      "       FSBK0       1.00      1.00      1.00         2\n",
      "       FSDJ0       1.00      0.50      0.67         2\n",
      "       FSGF0       1.00      1.00      1.00         2\n",
      "       FTAJ0       1.00      1.00      1.00         2\n",
      "       MABC0       1.00      0.50      0.67         2\n",
      "       MAJP0       0.00      0.00      0.00         2\n",
      "       MBMA1       1.00      1.00      1.00         2\n",
      "       MCAE0       1.00      1.00      1.00         2\n",
      "       MDRD0       1.00      1.00      1.00         2\n",
      "       MEAL0       1.00      1.00      1.00         2\n",
      "       MEJL0       1.00      1.00      1.00         2\n",
      "       MESJ0       1.00      1.00      1.00         2\n",
      "       MJRK0       1.00      1.00      1.00         2\n",
      "       MKES0       1.00      1.00      1.00         2\n",
      "       MKLN0       1.00      1.00      1.00         2\n",
      "       MMDB0       1.00      1.00      1.00         2\n",
      "       MPGR1       1.00      1.00      1.00         2\n",
      "       MRMB0       1.00      1.00      1.00         2\n",
      "       MRXB0       1.00      1.00      1.00         2\n",
      "       MSAT1       1.00      1.00      1.00         2\n",
      "       MSDS0       1.00      1.00      1.00         2\n",
      "       MSJK0       1.00      1.00      1.00         2\n",
      "       MSMR0       1.00      1.00      1.00         2\n",
      "       MSVS0       1.00      1.00      1.00         2\n",
      "       MTJU0       1.00      1.00      1.00         2\n",
      "       MTXS0       1.00      1.00      1.00         2\n",
      "       FBLV0       1.00      1.00      1.00         2\n",
      "       FCJS0       1.00      1.00      1.00         2\n",
      "       FCRZ0       1.00      1.00      1.00         2\n",
      "       FJEN0       1.00      1.00      1.00         2\n",
      "       FJHK0       1.00      1.00      1.00         2\n",
      "       FJRP1       0.50      0.50      0.50         2\n",
      "       FJSK0       1.00      1.00      1.00         2\n",
      "       FKDE0       1.00      1.00      1.00         2\n",
      "       FKSR0       1.00      1.00      1.00         2\n",
      "       FLEH0       1.00      1.00      1.00         2\n",
      "       FLET0       1.00      1.00      1.00         2\n",
      "       FMAH1       1.00      0.50      0.67         2\n",
      "       FMKC0       1.00      1.00      1.00         2\n",
      "       FPAB1       1.00      1.00      1.00         2\n",
      "       FPAC0       1.00      1.00      1.00         2\n",
      "       FREH0       1.00      1.00      1.00         2\n",
      "       FSPM0       1.00      1.00      1.00         2\n",
      "       FVKB0       1.00      1.00      1.00         2\n",
      "       MADD0       1.00      1.00      1.00         2\n",
      "       MAEO0       1.00      1.00      1.00         2\n",
      "       MAFM0       1.00      1.00      1.00         2\n",
      "       MBAR0       1.00      1.00      1.00         2\n",
      "       MBBR0       1.00      1.00      1.00         2\n",
      "       MBML0       1.00      1.00      1.00         2\n",
      "       MBOM0       1.00      1.00      1.00         2\n",
      "       MBTH0       1.00      1.00      1.00         2\n",
      "       MCLK0       1.00      1.00      1.00         2\n",
      "       MCRE0       0.67      1.00      0.80         2\n",
      "       MCTH0       1.00      1.00      1.00         2\n",
      "       MDCM0       1.00      1.00      1.00         2\n",
      "       MDED0       1.00      1.00      1.00         2\n",
      "       MDKS0       1.00      1.00      1.00         2\n",
      "       MDLC1       1.00      1.00      1.00         2\n",
      "       MDLM0       1.00      1.00      1.00         2\n",
      "       MDLR0       1.00      1.00      1.00         2\n",
      "       MDLR1       1.00      1.00      1.00         2\n",
      "       MDPB0       0.67      1.00      0.80         2\n",
      "       MFXS0       1.00      1.00      1.00         2\n",
      "       MFXV0       1.00      1.00      1.00         2\n",
      "       MGAK0       1.00      1.00      1.00         2\n",
      "       MGAR0       1.00      1.00      1.00         2\n",
      "       MGAW0       1.00      1.00      1.00         2\n",
      "       MGSL0       1.00      1.00      1.00         2\n",
      "       MHBS0       1.00      1.00      1.00         2\n",
      "       MHXL0       1.00      1.00      1.00         2\n",
      "       MJAI0       1.00      1.00      1.00         2\n",
      "       MJDG0       1.00      1.00      1.00         2\n",
      "       MJFR0       1.00      1.00      1.00         2\n",
      "       MJJM0       1.00      1.00      1.00         2\n",
      "       MJRA0       1.00      1.00      1.00         2\n",
      "       MKAG0       1.00      1.00      1.00         2\n",
      "       MKDB0       1.00      1.00      1.00         2\n",
      "       MKLR0       1.00      1.00      1.00         2\n",
      "       MMDG0       1.00      1.00      1.00         2\n",
      "       MMWS1       1.00      1.00      1.00         2\n",
      "       MNTW0       1.00      1.00      1.00         2\n",
      "       MPAR0       1.00      1.00      1.00         2\n",
      "       MPFU0       1.00      1.00      1.00         2\n",
      "       MREM0       1.00      1.00      1.00         2\n",
      "       MRLJ1       1.00      1.00      1.00         2\n",
      "       MRMG0       1.00      1.00      1.00         2\n",
      "       MRMH0       1.00      1.00      1.00         2\n",
      "       MRPC1       1.00      1.00      1.00         2\n",
      "       MSAH1       1.00      1.00      1.00         2\n",
      "       MSDB0       1.00      1.00      1.00         2\n",
      "       MSES0       1.00      1.00      1.00         2\n",
      "       MTAB0       1.00      1.00      1.00         2\n",
      "       MTER0       0.67      1.00      0.80         2\n",
      "       MTKD0       1.00      1.00      1.00         2\n",
      "       MTLC0       1.00      1.00      1.00         2\n",
      "       MTML0       1.00      1.00      1.00         2\n",
      "       MTMN0       1.00      1.00      1.00         2\n",
      "       MTPR0       1.00      1.00      1.00         2\n",
      "       MTWH1       1.00      1.00      1.00         2\n",
      "       MVRW0       1.00      1.00      1.00         2\n",
      "       MWRE0       1.00      1.00      1.00         2\n",
      "       MWRP0       1.00      1.00      1.00         2\n",
      "       FBCG1       1.00      1.00      1.00         2\n",
      "       FCEG0       1.00      1.00      1.00         2\n",
      "       FCLT0       1.00      1.00      1.00         2\n",
      "       FJRB0       0.67      1.00      0.80         2\n",
      "       FKLH0       1.00      1.00      1.00         2\n",
      "       FMBG0       1.00      1.00      1.00         2\n",
      "       FNKL0       1.00      1.00      1.00         2\n",
      "       FPLS0       1.00      1.00      1.00         2\n",
      "       MBCG0       1.00      1.00      1.00         2\n",
      "       MBSB0       1.00      1.00      1.00         2\n",
      "       MCXM0       1.00      1.00      1.00         2\n",
      "       MEJS0       1.00      1.00      1.00         2\n",
      "       MKDD0       1.00      1.00      1.00         2\n",
      "       MKRG0       1.00      1.00      1.00         2\n",
      "       MMEA0       1.00      1.00      1.00         2\n",
      "       MMLM0       1.00      1.00      1.00         2\n",
      "       MMPM0       1.00      1.00      1.00         2\n",
      "       MMWS0       1.00      1.00      1.00         2\n",
      "       MRDM0       1.00      1.00      1.00         2\n",
      "       MRLK0       1.00      1.00      1.00         2\n",
      "       MRRE0       1.00      1.00      1.00         2\n",
      "       MTCS0       1.00      1.00      1.00         2\n",
      "\n",
      "    accuracy                           0.96       924\n",
      "   macro avg       0.97      0.96      0.96       924\n",
      "weighted avg       0.97      0.96      0.96       924\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(test_report)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 保存report\n",
    "save_report(test_report,'test_report.txt')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAggAAAHHCAYAAADaqqCfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABNX0lEQVR4nO3deVxU5eIG8GcA2WHABUYUFZdUUiGxaLLymiSZuaTlci3R1ErRVMyUm4BLimkuuZelWNfSrPQqbhFuGWiK0nVByi1MHdQURjDWeX9/+GOu47DMwOzzfPucz8c588457zmS8/BuRyKEECAiIiJ6gIO5K0BERESWhwGBiIiItDAgEBERkRYGBCIiItLCgEBERERaGBCIiIhICwMCERERaWFAICIiIi0MCERERKSFAYHIzpSVleG9995DYGAgHBwc0L9/f3NXyWolJSVBIpHg8uXL5q4KkcExIJBRpaWlYebMmcjLyzPaOebNm4dt27YZ7fi6uHfvHmbOnIkDBw6YtR66WLduHRYuXIhXXnkFGzZswOTJk81dJYuwatUqJCUlmbsaRBZDwmcxkDF99NFHmDp1Ki5duoQWLVoY5Ryenp545ZVXzPqP+61bt9CoUSMkJCRg5syZZquHLoYMGYLDhw/jzz//NHdVLEqHDh3QsGFDvUJeeXk5SktL4eLiAolEYrzKEZkBWxCI7MyNGzfg4+Nj7mpYtcLCQgCAo6MjXF1dGQ7INgkiI0lISBAAtLZLly4JIYT48ssvRefOnYWrq6vw9fUVgwcPFjk5ORrH+O2338SAAQOEv7+/cHFxEU2aNBGDBw8WeXl5QghR6fGjoqJ0ruPXX38tOnfuLDw9PYWXl5fo0KGDWLp0qUaZO3fuiIkTJ4qmTZsKZ2dn0apVKzF//nxRXl4uhBDi0qVLldYjISGhxvMfOXJE9OrVS/j4+Ah3d3fRsWNHrfOnpqaKp59+Wri7uwupVCr69u0rzp49W+m9/v3330VUVJSQSqXC29tbjBgxQhQWFlZbz/3794v9+/er//ygis+sX79eve/69etixIgRokmTJsLZ2VnIZDLRt29f9d9rhV27dqnr7enpKV588UVx+vTpGu/JgyrqtXnzZjFz5kwREBAgPD09xcCBA0VeXp4oKioSEydOFI0aNRIeHh5ixIgRoqioSOMY69atE927dxeNGjUSzs7Oon379mLVqlUaZZo3b651X7p16yaEEGL9+vUCgDhw4IAYO3asaNSokfDx8dF4r+LaU1NThUQiEXFxcRrH37hxowCgdV4iS+ZkggxCdmrAgAH47bff8PXXX2PJkiVo2LAhAKBRo0aYO3cu4uLiMGjQIIwePRo3b97E8uXL8eyzz+LkyZPw8fFBSUkJIiMjUVxcjAkTJkAmk+Hq1atITk5GXl4epFIpvvzyS4wePRpPPPEE3nzzTQBAq1atdKpfSkoKhg4dih49euDDDz8EAGRlZeHnn3/GxIkTAdwfW9CtWzdcvXoVb731Fpo1a4a0tDTExsbi+vXrWLp0KRo1aoTVq1dj7NixePnllzFgwAAAQKdOnWo8/0svvYTGjRtj4sSJkMlkyMrKQnJysvr8P/74I3r16oWWLVti5syZ+Pvvv7F8+XJ07doVJ06c0Oq2GTRoEIKCgpCYmIgTJ07gs88+g5+fHz788EM0atQIX375JebOnYuCggIkJiYCANq3b4+srCyd7hkADBw4EGfOnMGECRPQokUL3LhxAykpKcjJyVHX58svv0RUVBQiIyPx4Ycf4t69e1i9ejWefvppnDx5Uu/upsTERLi5uWH69Ok4f/48li9fjnr16sHBwQF37tzBzJkzceTIESQlJSEoKAjx8fHqz65evRqPPvoo+vbtCycnJ+zYsQPjxo2DSqVCdHQ0AGDp0qWYMGECPD098f777wMA/P39Neowbtw4NGrUCPHx8eoWhIc999xzGDduHBITE9G/f3907twZ169fx4QJExAREYG3335br+smMitzJxSybQsXLtT4DUsIIS5fviwcHR3F3LlzNcqeOnVKODk5qfefPHlSABBbtmyp9hweHh56tRpUmDhxovD29hZlZWVVlpkzZ47w8PAQv/32m8b+6dOnC0dHR3WLx82bN3VuNRBCiLKyMhEUFCSaN28u7ty5o/GeSqVS/zk0NFT4+fmJv/76S73v119/FQ4ODmL48OHqfRUtCG+88YbGsV5++WXRoEEDjX3dunUTjz76qMY+XVsQ7ty5IwCIhQsXVnltd+/eFT4+PmLMmDEa+xUKhZBKpVr7q1NRrw4dOoiSkhL1/qFDhwqJRCJ69eqlUV4ul4vmzZtr7Lt3757WcSMjI0XLli019j366KPqVoMHVbQSPP3001o/Kw+3IAghRGFhoWjdurV49NFHRVFRkejdu7fw9vYWf/zxh45XTWQZOAaBTO7777+HSqXCoEGDcOvWLfUmk8nQpk0b7N+/HwAglUoBAHv37sW9e/cMXg8fHx8UFhYiJSWlyjJbtmzBM888A19fX426RkREoLy8HIcOHarVuU+ePIlLly5h0qRJWuMBKvqzr1+/jszMTIwYMQL169dXv9+pUyc8//zz2LVrl9ZxH/4N9ZlnnsFff/0FpVJZq3o+zM3NDc7Ozjhw4ADu3LlTaZmUlBTk5eVh6NChGvfM0dER4eHh6r9ffQwfPhz16tVTvw4PD4cQAm+88YZGufDwcFy5cgVlZWUada6Qn5+PW7duoVu3brh48SLy8/N1rsOYMWPg6OhYYzl3d3ckJSUhKysLzz77LHbu3IklS5agWbNmOp+LyBKwi4FM7vfff4cQAm3atKn0/YovgqCgIMTExGDx4sXYuHEjnnnmGfTt2xevvfaaOjzUxbhx4/DNN9+gV69eaNKkCXr27IlBgwbhhRde0Kjrf//7XzRq1KjSY9y4caPac/z9999aX0IymQwXLlwAcH/kfFX++OMPAEDbtm213mvfvj327t2LwsJCeHh4qPc//CXk6+sLALhz5w68vb2rrasuXFxc8OGHH2LKlCnw9/fHk08+iZdeegnDhw+HTCYDcP+eAfeb2ytTm3o8fF0Vf/+BgYFa+1UqFfLz89GgQQMAwM8//4yEhASkp6drBc38/Hydf5aCgoJ0rm/Xrl0xduxYrFy5EpGRkVpBhsgaMCCQyalUKkgkEuzevbvS38g8PT3Vf160aBFGjBiB//znP/jhhx/wzjvvIDExEUeOHEHTpk3rVA8/Pz9kZmZi79692L17N3bv3o3169dj+PDh2LBhg7quzz//PN57771Kj/HII49Ue47Nmzdj5MiRGvuEEWcWV/Ubbk3nrGoUfnl5uda+SZMmoU+fPti2bRv27t2LuLg4JCYmYt++fXjsscegUqkA3B+HUBEaHuTkpP8/O1VdV03Xe+HCBfTo0QPt2rXD4sWLERgYCGdnZ+zatQtLlixR11UXD7ZE1KS4uFg9XfLChQu4d+8e3N3ddf48kSVgQCCjquyLp1WrVhBCICgoqMYvWADo2LEjOnbsiBkzZiAtLQ1du3bFmjVr8MEHH1R5Dl05OzujT58+6NOnD1QqFcaNG4dPPvkEcXFxaN26NVq1aoWCggJERERUe5yq6hAZGVlpF0bFQMrTp09XeezmzZsDALKzs7XeO3fuHBo2bKjRelAXFS0NDy9oVdGK8bBWrVphypQpmDJlCn7//XeEhoZi0aJF+Pe//62+Nj8/vxrvm7Ht2LEDxcXF2L59u0YrRGXdHIacqpiQkICsrCx89NFHmDZtGqZPn45ly5YZ7PhEpsAxCGRUFV9gD37xDBgwAI6Ojpg1a5bWb7ZCCPz1118AAKVSqdGXDNwPCw4ODiguLtY4R21Waqw4TwUHBwf1zIOK4w8aNAjp6enYu3ev1ufz8vLU9av47fDhejRu3BgREREaGwB07twZQUFBWLp0qdZnKu5J48aNERoaig0bNmiUOX36NH744Qe8+OKLel9zVZo3bw5HR0etMRWrVq3SeH3v3j0UFRVp7GvVqhW8vLzU9ywyMhLe3t6YN28eSktLtc518+ZNg9W7JhUtDA/+nOXn52P9+vVaZWv7c/Swo0eP4qOPPsKkSZMwZcoUTJ06FStWrMDBgwfrfGwiU2ILAhlVWFgYAOD999/HkCFDUK9ePfTp0wcffPABYmNjcfnyZfTv3x9eXl64dOkStm7dijfffBPvvvsu9u3bh/Hjx+PVV1/FI488grKyMnz55ZdwdHTEwIEDNc7x448/YvHixQgICEBQUBDCw8NrrNvo0aNx+/ZtPPfcc2jatCn++OMPLF++HKGhoWjfvj0AYOrUqdi+fTteeukljBgxAmFhYSgsLMSpU6fw7bff4vLly2jYsCHc3NwQHByMzZs345FHHkH9+vXRoUOHKscYODg4YPXq1ejTpw9CQ0MxcuRING7cGOfOncOZM2fUgWThwoXo1asX5HI5Ro0apZ7mKJVKDbpio1Qqxauvvorly5dDIpGgVatWSE5O1hpj8dtvv6FHjx4YNGgQgoOD4eTkhK1btyI3NxdDhgwBcH+MwerVq/H666+jc+fOGDJkCBo1aoScnBzs3LkTXbt2xYoVKwxW9+r07NlT3Ur01ltvoaCgAGvXroWfnx+uX7+uUTYsLAyrV6/GBx98gNatW8PPz6/KcRRVKSoqQlRUFNq0aYO5c+cCAGbNmoUdO3Zg5MiROHXqlMFafYiMzlzTJ8h+zJkzRzRp0kQ4ODhoTAn77rvvxNNPPy08PDyEh4eHaNeunYiOjhbZ2dlCCCEuXrwo3njjDdGqVSvh6uoq6tevL7p37y5+/PFHjeOfO3dOPPvss8LNzU2vhZK+/fZb0bNnT+Hn5yecnZ1Fs2bNxFtvvSWuX7+uUe7u3bsiNjZWtG7dWjg7O4uGDRuKp556Snz00UcaU+/S0tJEWFiYcHZ21nnK4+HDh8Xzzz8vvLy8hIeHh+jUqZNYvny5Rpkff/xRdO3aVbi5uQlvb2/Rp0+fKhdKunnzpsb+yqbhVTbNUYj7UzUHDhwo3N3dha+vr3jrrbfE6dOnNaY53rp1S0RHR4t27doJDw8PIZVKRXh4uPjmm2+0jrd//34RGRkppFKpcHV1Fa1atRIjRowQx48fr/G+PHgMVDLVteK6jh07VuN92L59u+jUqZNwdXUVLVq0EB9++KFYt26d1n1RKBSid+/ewsvLq9KFkh4+14PvVRxn8uTJwtHRURw9elSj3PHjx4WTk5MYO3asztdOZG58FgMRERFp4RgEIiIi0sIxCGRzysvLaxwI5+npqTGdkkyrpKQEt2/frraMVCrVa2ohERkWAwLZnCtXrtS4qI01PJbZlqWlpaF79+7Vllm/fj1GjBhhmgoRkRabGYOwcuVKLFy4EAqFAiEhIVi+fDmeeOIJc1eLzKCoqAiHDx+utkzLli3RsmVLE9WIHnbnzh1kZGRUW+bRRx9F48aNTVQjIst16NAhLFy4EBkZGbh+/Tq2bt2K/v37V/uZAwcOICYmBmfOnEFgYCBmzJihd+C2iRaEzZs3IyYmBmvWrEF4eDiWLl2KyMhIZGdnw8/Pz9zVIxNzdXU1+wI9VD1fX1/+HRHpqLCwECEhIXjjjTfUT4utzqVLl9C7d2+8/fbb2LhxI1JTUzF69Gg0btwYkZGROp/XJloQwsPD8fjjj6vnVqtUKgQGBmLChAmYPn26mWtHRERkGBKJpMYWhGnTpmHnzp04ffq0et+QIUOQl5eHPXv26Hwuq29BKCkpQUZGBmJjY9X7HBwcEBERgfT0dJ2OoVKpcO3aNXh5eRl0uVUiIjI+IQTu3r2LgIAAODgYb3JeUVERSkpKDHIsIYTW942LiwtcXFzqfOz09HStFrrIyEhMmjRJr+NYfUC4desWysvL4e/vr7Hf398f586dq/QzxcXFGkv1Xr16FcHBwUatJxERGdeVK1fq/BC3qhQVFcHNqwFQZphHz3t6eqKgoEBjn6EGTysUikq/E5VKJf7++2+dZwdZfUCojcTERMyaNUtrv3NwFK78xAeqEBFZk7tKJVoHBcLLy8to5ygpKQHK7sElOApwdK7bwcpLUHB2A65cuaLx+HNDtB4YktUHhIYNG8LR0RG5ubka+3Nzcyt91CwAxMbGIiYmRv1aqVQiMDAQV35ahuY9/oU7x0yzTjwRERmOSbqInVwhqWNAEJL73SDe3t4aAcFQZDJZpd+J3t7eeq0tYvUrKTo7OyMsLAypqanqfSqVCqmpqZDL5ZV+xsXFRf0X8/Bf0J1jK+D7+Hij15uIiKyQBIBEUsfNuFWUy+Ua34kAkJKSUuV3YlWsPiAAQExMDNauXYsNGzYgKysLY8eORWFhIUaOHFmr4zEkEBFRpSQOhtn0UFBQgMzMTGRmZgK4P40xMzMTOTk5AO63ig8fPlxd/u2338bFixfx3nvv4dy5c1i1ahW++eYbTJ48Wa/zWn0XAwAMHjwYN2/eRHx8PBQKBUJDQ7Fnzx6tQRr6qAgJ7G4gIiJzOn78uMbKoxVd5FFRUUhKSsL169fVYQEAgoKCsHPnTkyePBkff/wxmjZtis8++0yvNRAAG1kHoa6USiWkUily/8rX6g9iSCAismxKpRL+DaTIz9f+N9yQ55BKpXB5bBwkjnUbTCjKi1F8cpVR62sINtHFYEzsbiAiIjUzdDGYi3XU0swYEoiIyN4wIOiIIYGIiOo+g+H/NyvAgKAHhgQiIntniO4F6/jqtY5aWhCGBCIisgcMCLXAkEBEZKfYxUA1YUggIrJDnMVAumBIICIiW8WAUEdcRIks2ZTtZ81dBSLbwi4G0hdbEsgSLeobbO4qENkWdjGQvtjdQERkB9iCQLXBkEBERLaCAcHA7hxbwX5fIiJbxS4GqotFfYPZkkBEZIskEgMEBHYx2DV2NxARkTVjQDAihgQiIhvjIDHMZgUYEIyMIYGIyIZwDAIZEkMCERFZGwYEE2FIICKyAVwHgYyBIYGIyMqxi4GMhSGBiIisAQOCGTAkEBFZKXYxkLExJBARWSF2MZApcFlmIuvF/3ftFFsQyFS4LDORdeKjtMnWMSBYAHY3EBFZCXYxkKkxJBARWQF2MZA5MCQQEZGlYECwMAwJRESWzBDdC9bx1WsdtbQzDAlERBaKXQxkbgwJRERkTgwIFowhgYjIwkgkBpjFwBYEMgCGBCIiC8JpjmRJGBKIiMjUGBCsBEMCEZEF4CBFskQMCUREZsYuBrJUDAlERGbEFgSyZAwJRERkbAwIVoohgYjIDNjFQNaAIYGIyMTYxUDWgiGBiIiMgQHBBjAkEBGZhkQiMchmDRgQbARDAhGR8TEgkFViSCAiIkNhQLAxDAlEREYkMdBmBRgQbBBDAhGRcbCLgaweQwIREdUFA4INY0ggIjIstiCQzbhzbIW5q0BEdm7K9rPmroLBMCCQzWFLAhGZy6K+weaugsEwIJDNYXcDERHpgwHBjjAkEBHVEac5kq1iSCAiqj12MZBNY0ggIqKaMCDYqTvHVtjUyGJz4P0jsj/3n9Zc1xYEc1+FbhgQ7NiivsFsSagDWxqZTUS6kcAAXQxWMgiBAcHOsbuBiIgqw4BADAlERDriIEWyOwwJREQ64DRHskcMCUREVIEBgTQwJBARVcMQ3QvsYiBrxZBARFQ5jkEgu8eQQESkjQGBCFxMiYjIUqxcuRItWrSAq6srwsPD8csvv1RbfunSpWjbti3c3NwQGBiIyZMno6ioSK9zMiBQtbiYEhHRA8wwi2Hz5s2IiYlBQkICTpw4gZCQEERGRuLGjRuVlv/qq68wffp0JCQkICsrC59//jk2b96Mf/3rX3qdlwGBasTuBiKi+8zRxbB48WKMGTMGI0eORHBwMNasWQN3d3esW7eu0vJpaWno2rUr/vnPf6JFixbo2bMnhg4dWmOrw8MYEEgnDAlERIalVCo1tuLiYq0yJSUlyMjIQEREhHqfg4MDIiIikJ6eXulxn3rqKWRkZKgDwcWLF7Fr1y68+OKLetWPAYF0xpBARPbOkC0IgYGBkEql6i0xMVHrfLdu3UJ5eTn8/f019vv7+0OhUFRax3/+85+YPXs2nn76adSrVw+tWrXCP/7xD3YxkHExJBCRPTNkQLhy5Qry8/PVW2xsrEHqeODAAcybNw+rVq3CiRMn8P3332Pnzp2YM2eOXscxa0A4dOgQ+vTpg4CAAEgkEmzbtk3jfSEE4uPj0bhxY7i5uSEiIgK///67Rpnbt29j2LBh8Pb2ho+PD0aNGoWCggITXoX9YUggIqo7b29vjc3FxUWrTMOGDeHo6Ijc3FyN/bm5uZDJZJUeNy4uDq+//jpGjx6Njh074uWXX8a8efOQmJgIlUqlc/3MGhAKCwsREhKClStXVvr+ggULsGzZMqxZswZHjx6Fh4cHIiMjNaZqDBs2DGfOnEFKSgqSk5Nx6NAhvPnmm6a6BLvFkEBE9sjUgxSdnZ0RFhaG1NRU9T6VSoXU1FTI5fJKP3Pv3j04OGh+vTs6OgK4/4u3rpx0LmkEvXr1Qq9evSp9TwiBpUuXYsaMGejXrx8A4IsvvoC/vz+2bduGIUOGICsrC3v27MGxY8fQpUsXAMDy5cvx4osv4qOPPkJAQIDJrsUeVYSEO8dWmLsqRESmYYiHLen5+ZiYGERFRaFLly544oknsHTpUhQWFmLkyJEAgOHDh6NJkybqMQx9+vTB4sWL8dhjjyE8PBznz59HXFwc+vTpow4KujBrQKjOpUuXoFAoNEZuSqVShIeHIz09HUOGDEF6ejp8fHzU4QAAIiIi4ODggKNHj+Lll182R9XtCkMCEZFxDR48GDdv3kR8fDwUCgVCQ0OxZ88e9cDFnJwcjRaDGTNmQCKRYMaMGbh69SoaNWqEPn36YO7cuXqd12IDQsXozOpGbioUCvj5+Wm87+TkhPr161c5uhMAiouLNaaTKJVKQ1XbLlWsuLiob7C5q0JEZFSGWCq5Np8fP348xo+vvFv3wIEDGq+dnJyQkJCAhISE2lRPzS5nMSQmJmpMLQkMDDR3laweV1wkInvAZzFYgIrRmdWN3JTJZFpLTZaVleH27dtVju4EgNjYWI2pJVeuXDFw7e0TBy4Ska1jQLAAQUFBkMlkGiM3lUoljh49qh65KZfLkZeXh4yMDHWZffv2QaVSITw8vMpju7i4aE0vIcNgSCAisg1mHYNQUFCA8+fPq19funQJmZmZqF+/Ppo1a4ZJkybhgw8+QJs2bRAUFIS4uDgEBASgf//+AID27dvjhRdewJgxY7BmzRqUlpZi/PjxGDJkCGcwmBEHLhKRzTLDLAZzMWtAOH78OLp3765+HRMTAwCIiopCUlIS3nvvPRQWFuLNN99EXl4enn76aezZsweurq7qz2zcuBHjx49Hjx494ODggIEDB2LZsmUmvxbSxJBARLbIXIMUzUEi9Fk1wUYplUpIpVLk/pXP7gYDY0ggImNTKpXwbyBFfr7x/g2v+J5o8ubXcHB2r9OxVCX3cPXToUatryFY7BgEsg0ck0BEtoSDFIkMiCGBiGyFBAYICFYyCIEBgUyCIYGIyLowIJDJMCQQkbVjFwORkTAkEJFVkxhoswIMCGRyDAlERJaPAYHMgiGBiKyRPXUxWOzTHMn2cX0EIrI29rRQElsQyOzYkkBE1kIiMcxmDRgQyOzY3UBEZHkYEMgiMCQQkTW43wJQ1zEI5r4K3TAgkMVgSCAii2eI7gUGBCL9PTxwkYGBiMg8GBDIIk3ZfhYAZzqQ5ar4GSX7Yk/THBkQyCIt6hvM1gOyaIv6Bpu7CmQGnMVAZAE4JoGIyHwYEMiiMSQQkSVxcJAYZLMGDAhk0aZsP4s7x1awv5eILAK7GIgsREU/L8ckEBGZFgMCWQ12NxCRuXEWA5GFYncDEZkTuxiILBi7G4jIXNiCQGTh2N1ARGRcDAhktRgSiMjU2IJAZCUYEojIlDgGgciKMCQQERkeAwLZBIYEIjIFCQzQxWAlz3tmQCCbwZBARMbGLgYiK8WQQERkGAwIZHMYEojIWDiLgcjKMSQQkTGwi4HIBjAkEBHVHgMC2TSGBCIyJHYxENkQhgQiMhR2MRDZGIYEIjIEtiAQ2SCGBCIi3TEgkF1hSCCiOjFE94J1NCAwIJD9YUggotpiFwORjWNIICKqHgMC2S2GBCLSF2cxENkJhgQi0ge7GIjsCEMCEZE2BgQiMCQQkW7YxUBkh+4cW4Ep28+auxpGZw/XSGQs7GIgslOL+gbbfEvCor7B5q4CEVkBBgSih7C7gYiqwhYEIjvHkEBEleEYBCJiSCAiLWxBICIADAlEZL8YEIhqwJBARBXYxUBEGhgSiAhgFwMRVYIhgYjsCQMCkR4YEojsmwQG6GIw90XoiAGBSE8MCUT2y0EiMchmDRgQiGqBIYGIbB0DAlEtMSQQ2R/OYiAinTAkENkXzmIgIp0xJBDZDweJYTZ9rVy5Ei1atICrqyvCw8Pxyy+/VFs+Ly8P0dHRaNy4MVxcXPDII49g165d+l2r/tUkoocxJBCRsWzevBkxMTFISEjAiRMnEBISgsjISNy4caPS8iUlJXj++edx+fJlfPvtt8jOzsbatWvRpEkTvc7LgEBkIAwJRHZAUvduBn3nOS5evBhjxozByJEjERwcjDVr1sDd3R3r1q2rtPy6detw+/ZtbNu2DV27dkWLFi3QrVs3hISE6HVeBgQiA2JIILJthhykqFQqNbbi4mKt85WUlCAjIwMRERHqfQ4ODoiIiEB6enqlddy+fTvkcjmio6Ph7++PDh06YN68eSgvL9frWhkQiAyMIYGIdBEYGAipVKreEhMTtcrcunUL5eXl8Pf319jv7+8PhUJR6XEvXryIb7/9FuXl5di1axfi4uKwaNEifPDBB3rVz0mv0kSkk4qQcOfYCnNXhYgMSPL//9X1GABw5coVeHt7q/e7uLjU6bgVVCoV/Pz88Omnn8LR0RFhYWG4evUqFi5ciISEBJ2Pw4BAZCQMCUS2p7azEB4+BgB4e3trBITKNGzYEI6OjsjNzdXYn5ubC5lMVulnGjdujHr16sHR0VG9r3379lAoFCgpKYGzs7Nu9dSpFBHVCrsbiKgunJ2dERYWhtTUVPU+lUqF1NRUyOXySj/TtWtXnD9/HiqVSr3vt99+Q+PGjXUOBwADApHRMSQQ2Q5zLJQUExODtWvXYsOGDcjKysLYsWNRWFiIkSNHAgCGDx+O2NhYdfmxY8fi9u3bmDhxIn777Tfs3LkT8+bNQ3R0tF7n1amLYfv27TofsG/fvnpVgMgesLuByDYYYqlkfT8/ePBg3Lx5E/Hx8VAoFAgNDcWePXvUAxdzcnLg4PC/3/cDAwOxd+9eTJ48GZ06dUKTJk0wceJETJs2Tb96CiFETYUePHG1B5NI9J5GYQmUSiWkUily/8qvsT+IqC4YEogMT6lUwr+BFPn5xvs3vOJ74sVl+1HPzbNOxyr9uwC73ulu1Poagk7f/CqVSqfNGsMBkSmxu4HIuvFxzzoqKiqq08kTExPx+OOPw8vLC35+fujfvz+ys7O1zhEdHY0GDRrA09MTAwcO1BrNmZOTg969e8Pd3R1+fn6YOnUqysrK6lQ3ImNhSCCyXnyaYzXKy8sxZ84cNGnSBJ6enrh48SIAIC4uDp9//rlexzp48CCio6Nx5MgRpKSkoLS0FD179kRhYaG6zOTJk7Fjxw5s2bIFBw8exLVr1zBgwACN+vTu3RslJSVIS0vDhg0bkJSUhPj4eH0vjchkGBKIrBOf5liNuXPnIikpCQsWLNCYLtGhQwd89tlneh1rz549GDFiBB599FGEhIQgKSkJOTk5yMjIAADk5+fj888/x+LFi/Hcc88hLCwM69evR1paGo4cOQIA+OGHH3D27Fn8+9//RmhoKHr16oU5c+Zg5cqVKCkp0ffyiEyGIYGILJneAeGLL77Ap59+imHDhmkswhASEoJz587VqTL5+fkAgPr16wMAMjIyUFpaqrEGdbt27dCsWTP1GtTp6eno2LGjxjKUkZGRUCqVOHPmTJ3qQ2RsDAlE1oVdDNW4evUqWrdurbVfpVKhtLS01hVRqVSYNGkSunbtig4dOgAAFAoFnJ2d4ePjo1H2wTWoFQpFpWtUV7xXmeLiYq2HZBCZC0MCkfXgIMVqBAcH46efftLa/+233+Kxxx6rdUWio6Nx+vRpbNq0qdbH0FViYqLGAzICAwONfk6i6jAkEJGl0ftZDPHx8YiKisLVq1ehUqnw/fffIzs7G1988QWSk5NrVYnx48cjOTkZhw4dQtOmTdX7ZTIZSkpKkJeXp9GK8OAa1DKZDL/88ovG8SpmOVS1TnVsbCxiYmLUr5VKJUMCmR0XUyKyfJL/3+p6DGugdwtCv379sGPHDvz444/w8PBAfHw8srKysGPHDjz//PN6HUsIgfHjx2Pr1q3Yt28fgoKCNN4PCwtDvXr1NNagzs7ORk5OjnoNarlcjlOnTuHGjRvqMikpKfD29kZwcHCl53VxcVE/JEOXh2UQmQpbEogsmz3NYqjV0xyfeeYZpKSk1Pnk0dHR+Oqrr/Cf//wHXl5e6jEDUqkUbm5ukEqlGDVqFGJiYlC/fn14e3tjwoQJkMvlePLJJwEAPXv2RHBwMF5//XUsWLAACoUCM2bMQHR0tMEenUlkSmxJICJLUOvHPR8/fhxZWVkA7o9LCAsL0/sYq1evBgD84x//0Ni/fv16jBgxAgCwZMkSODg4YODAgSguLkZkZCRWrVqlLuvo6Ijk5GSMHTsWcrkcHh4eiIqKwuzZs2t3YUQWgCGByDIZ8nHPlk6nZzE86M8//8TQoUPx888/q8cF5OXl4amnnsKmTZs0xhBYCz6LgSwVQwJRzUz5LIZBnx42yLMYvnnzadt4FsODRo8ejdLSUmRlZeH27du4ffs2srKyoFKpMHr0aGPUkchucUwCEZmL3gHh4MGDWL16Ndq2bave17ZtWyxfvhyHDh0yaOWIiCGByNLYwyJJQC0CQmBgYKULIpWXlyMgIMAglSIiTQwJRJbBnmYx6B0QFi5ciAkTJuD48ePqfcePH8fEiRPx0UcfGbRyRPQ/DAlE5lcxSLGumzXQaRaDr6+vRuIpLCxEeHg4nJzuf7ysrAxOTk5444030L9/f6NUlIjuh4Qp289iUd/K1/ggqgx/Zqg2dAoIS5cuNXI1iEhXi/oGc3YD6YXhwHAM0UVgLV0MOgWEqKgoY9eDiPTAdRKIzINLLeuoqKiIT0UkMhOOSSAiY9I7IBQWFmL8+PHw8/ODh4cHfH19NTYiMh2GBCLT4uOeq/Hee+9h3759WL16NVxcXPDZZ59h1qxZCAgIwBdffGGMOhJRNRgSiEynrmsgWNNaCHoHhB07dmDVqlUYOHAgnJyc8Mwzz2DGjBmYN28eNm7caIw6ElENGBKIyND0Dgi3b99Gy5YtAQDe3t64ffs2AODpp5/mSopEZsSQQGR8XCipGi1btsSlS5cAAO3atcM333wD4H7LQsXDm4jIPBgSiIyLXQzVGDlyJH799VcAwPTp07Fy5Uq4urpi8uTJmDp1qsErSET6YUggIkPQaR2EB02ePFn954iICJw7dw4ZGRlo3bo1OnXqZNDKEVHtcJ0EIuMwxCwEa5nFoHdAeFjz5s3RvHlzQ9SFiAyIIYHI8AzRRWAl+UC3gLBs2TKdD/jOO+/UujJEZFgMCUSGxaWWH7JkyRKdDiaRSBgQiCwMQwIR1YZOAaFi1gIRWSeGBCLDcEAdn1FggM+birXUk4jqiLMbiOqO6yAQkU1iSCAiXTEgENkZhgSi2pNIAIc6blbSgMCAQGSPGBKIaqeu4aBiswYMCER2iiGBiKpTq4Dw008/4bXXXoNcLsfVq1cBAF9++SUOHz5s0MoRkXExJBDph4MUq/Hdd98hMjISbm5uOHnyJIqLiwEA+fn5mDdvnsErSETGxZBApDt2MVTjgw8+wJo1a7B27VrUq1dPvb9r1644ceKEQStHRKbBkEBED9M7IGRnZ+PZZ5/V2i+VSpGXl2eIOhGRGTAkENWMj3uuhkwmw/nz57X2Hz58GC1btjRIpYjIPBgSiKpX8TTHum7WQO+AMGbMGEycOBFHjx6FRCLBtWvXsHHjRrz77rsYO3asMepIRCbEkEBUNQcDbdZA78c9T58+HSqVCj169MC9e/fw7LPPwsXFBe+++y4mTJhgjDoSkYnx2Q1EpHeQkUgkeP/993H79m2cPn0aR44cwc2bNzFnzhxj1I+IzIQtCUTa7GkMgt4tCBWcnZ0RHBxsyLoQkYVhSwKRJgfUfQyBA6wjIegdELp3717tIg/79u2rU4WIyLIwJBDZJ70DQmhoqMbr0tJSZGZm4vTp04iKijJUvYjIgjAkEN1niC4Cm+1iWLJkSaX7Z86ciYKCgjpXiIgsE0MCkWFWQrTZlRSr8tprr2HdunWGOhwRWSAOXCSyHwYLCOnp6XB1dTXU4YjIQt05tgJTtp81dzWIzEIiqftiSTbbxTBgwACN10IIXL9+HcePH0dcXJzBKkZElmtR32B2N5Bd4hiEakilUo3XDg4OaNu2LWbPno2ePXsarGJEZNk4JoHItukVEMrLyzFy5Eh07NgRvr6+xqoTEVkJhgSyNxykWAVHR0f07NmTT20kIjUOXCR7IjHQf9ZA70GKHTp0wMWLF41RFyKyUgwJZC8qWhDqulkDvQPCBx98gHfffRfJycm4fv06lEqlxkZE9okhgci26BwQZs+ejcLCQrz44ov49ddf0bdvXzRt2hS+vr7w9fWFj48PxyUQ2TmGBLJ19tSCoPMgxVmzZuHtt9/G/v37jVkfIrJyHLhItkwikVT7PCJdj2ENdA4IQggAQLdu3YxWGSKyDQwJRNZPrzEI1pJ6bAlXrCNrxRUXyRaxi6EKjzzySI0h4fbt23WqEGla1DfY3FUgqjWuuEi2hispVmHWrFlaKykSEVWH3Q1E1kmvgDBkyBD4+fkZqy5EZKMYEshWVDxwqa7HsAY6j0Hg+AMiqgtOgSRbYK4xCCtXrkSLFi3g6uqK8PBw/PLLLzp9btOmTZBIJOjfv7/e59Q5IFTMYiAiqi2GBCL9bd68GTExMUhISMCJEycQEhKCyMhI3Lhxo9rPXb58Ge+++y6eeeaZWp1X54CgUqnYvUBEdcaQQFZN8r+BirXd9H0Uw+LFizFmzBiMHDkSwcHBWLNmDdzd3bFu3boqP1NeXo5hw4Zh1qxZaNmyZa0uVe+llomI6oohgayVAyQG2QBoPaqguLhY63wlJSXIyMhARETE/+rg4ICIiAikp6dXWc/Zs2fDz88Po0aNqsO1EhGZAUMCWaO6th48OE0yMDAQUqlUvSUmJmqd79atWygvL4e/v7/Gfn9/fygUikrrePjwYXz++edYu3Ztna5Vr1kMRESGxNkNZM+uXLkCb29v9WsXF5c6H/Pu3bt4/fXXsXbtWjRs2LBOx2JAICKzYkgga2KIlRArPu/t7a0RECrTsGFDODo6Ijc3V2N/bm4uZDKZVvkLFy7g8uXL6NOnj3qfSqUCADg5OSE7OxutWrXSrZ46lSIiMiJ2N5C1qFgHoa6brpydnREWFobU1FT1PpVKhdTUVMjlcq3y7dq1w6lTp5CZmane+vbti+7duyMzMxOBgYE6n5stCERkEdiSQFS5mJgYREVFoUuXLnjiiSewdOlSFBYWYuTIkQCA4cOHo0mTJkhMTISrqys6dOig8XkfHx8A0NpfEwYEIrIYDAlk6czxLIbBgwfj5s2biI+Ph0KhQGhoKPbs2aMeuJiTkwMHB8N3CEgEV0CCUqmEVCpF7l/5NfYHEZHxMSSQPpRKJfwbSJGfb7x/wyu+J5annoabp1edjvV3wV1M6NHBqPU1BI5BICKLwzEJRObHgEBEFokhgSyRIddBsHQMCERksRgSyNI4GGizBtZSTyKyUwwJRObBgEBEFo8hgSyFRCIxyGYNGBCIyCowJJAlkBhoswYMCERkNRgSyNxMvZKiOZk1IKxevRqdOnVSr0ctl8uxe/du9ftFRUWIjo5GgwYN4OnpiYEDB2qtR52Tk4PevXvD3d0dfn5+mDp1KsrKykx9KURkIgwJRKZh1oDQtGlTzJ8/HxkZGTh+/Diee+459OvXD2fOnAEATJ48GTt27MCWLVtw8OBBXLt2DQMGDFB/vry8HL1790ZJSQnS0tKwYcMGJCUlIT4+3lyXREQmwJBA5mQP3QuABa6kWL9+fSxcuBCvvPIKGjVqhK+++gqvvPIKAODcuXNo37490tPT8eSTT2L37t146aWXcO3aNfWSk2vWrMG0adNw8+ZNODs763ROrqRIZJ2mbD+LRX2DzV0NMjNTrqS49uBZuNdxJcV7BXcxplswV1LUVXl5OTZt2oTCwkLI5XJkZGSgtLQUERER6jLt2rVDs2bNkJ6eDgBIT09Hx44d1eEAACIjI6FUKtWtEERkuxb1DWZLApGRmP1hTadOnYJcLkdRURE8PT2xdetWBAcHIzMzE87OzuqnUFXw9/eHQqEAACgUCo1wUPF+xXtVKS4uRnFxsfq1Uqk00NUQkanxAU9kSoaYpshpjjpq27YtMjMzcfToUYwdOxZRUVE4e/asUc+ZmJgIqVSq3vR5PjYRWR6OSSBT4UqKJuTs7IzWrVsjLCwMiYmJCAkJwccffwyZTIaSkhLk5eVplM/NzYVMJgMAyGQyrVkNFa8rylQmNjYW+fn56u3KlSuGvSiyGlO2GzeMkuncObaCf59EBmT2gPAwlUqF4uJihIWFoV69ekhNTVW/l52djZycHMjlcgCAXC7HqVOncOPGDXWZlJQUeHt7Izi46oFLLi4u6qmVFRvZJw5wsy0ck0DGZk8rKZp1DEJsbCx69eqFZs2a4e7du/jqq69w4MAB7N27F1KpFKNGjUJMTAzq168Pb29vTJgwAXK5HE8++SQAoGfPnggODsbrr7+OBQsWQKFQYMaMGYiOjoaLi4s5L42IzIRjEsiYDDFV0TrigZkDwo0bNzB8+HBcv34dUqkUnTp1wt69e/H8888DAJYsWQIHBwcMHDgQxcXFiIyMxKpVq9Sfd3R0RHJyMsaOHQu5XA4PDw9ERUVh9uzZ5rokIrIADAlEdWdx6yCYA9dBILJNDAn2wZTrIGw4nG2QdRCinm7LdRCIiMyFsxvI0DiLgYjIRjAkkCHZ0yBFBgQisnkMCUT6Y0AgIrvAkECGUNcHNVnTA5sYEIjIbjAkUF1JJIbZrAEDAhHZFYYEIt0wIBCR3WFIoNpygMQgmzVgQCAiu8SQQLXBLgYiIjvAkEBUNQYEIrJrDAmkD4mB/rMGDAhEZPcYEkhX7GIgIrIzd46twJTtZ81dDSKLwYBARPT/FvUNZksCVUtigBkM7GIgIrJC7G6g6rCLgYjIjrG7garCgEBEZOfY3UD2jgGBLB5/kyNzYUsCPcyepjk6mbsCRNXxfXw87hxbYe5qkB1b1DfY3FUgC+Igub/V9RjWgC0IZNHeiBtn7ioQAWBLFtkfBgSyaPztjSwFxyQQYF9dDAwIREQ64hRI4iwGsgps8iQyPQ5cJHvBgGDF2PxOZB7sbrBfEhiim8E6MCAQEdUCuxvsU8Ushrpu1oABgYiolhgSyJYxIBAR1QFDgn3hLAaqEQcpEVEFDly0H5zFQDXiAEHiFwI9iP8m2AeJgTZrwIBAVEv8QqDKsLuBbAUDAhGRAXFMgm1zgAQOkjpuVtKGwIBARGRgDAm2i10MRERUJwwJZO34uGciIiPho8ptkCGaAKykCYEtCERERsaWBNvBdRCIiMhg2N1A1ogBgYjIBBgSbIQhFkmyjgYEBgQiIlNhSLB+nMVARERGwZBA1oIBgYjIxBgSrJgdNSEwIBARmQFDgnXiLAYiIjI6hgTrw6c5EhGRSTAkkKViQCAiMjOGBOthR0MQGBCIiCwBQ4KVsKOEwIBARGQhGBLIkjAgEBFZEIYEy2auWQwrV65EixYt4OrqivDwcPzyyy9Vll27di2eeeYZ+Pr6wtfXFxEREdWWrwoDAhGRhWFIsFzmmMWwefNmxMTEICEhASdOnEBISAgiIyNx48aNSssfOHAAQ4cOxf79+5Geno7AwED07NkTV69e1e9ahRBCv6raHqVSCalUity/8uHt7W3u6hARAbj/FEg+MrpmSqUS/g2kyM833r/hFd8TP53+E55edTtHwV0lnunQVOf6hoeH4/HHH8eKFfd/FlQqFQIDAzFhwgRMnz69xs+Xl5fD19cXK1aswPDhw3WuJ1sQiIgs1J1jKzBl+1lzV8OkLP16DTlGUalUamzFxcVa5yspKUFGRgYiIiLU+xwcHBAREYH09HSd6nzv3j2Ulpaifv36el0rAwIRkQVb1DfYrrobFvUNNncVqmfAhBAYGAipVKreEhMTtU5369YtlJeXw9/fX2O/v78/FAqFTlWeNm0aAgICNEKGLpz0Kk1ERCZXMSaB3Q225cqVKxpdDC4uLgY/x/z587Fp0yYcOHAArq6uen2WLQhERFaAAxctgyFnMXh7e2tslQWEhg0bwtHREbm5uRr7c3NzIZPJqq3rRx99hPnz5+OHH35Ap06d9L5WBgQiIivBkGB+pp7F4OzsjLCwMKSmpqr3qVQqpKamQi6XV/m5BQsWYM6cOdizZw+6dOlSq2tlQCAisiIMCeZljoUUY2JisHbtWmzYsAFZWVkYO3YsCgsLMXLkSADA8OHDERsbqy7/4YcfIi4uDuvWrUOLFi2gUCigUChQUFCg13k5BoGIyMpwTIJ9GTx4MG7evIn4+HgoFAqEhoZiz5496oGLOTk5cHD43+/7q1evRklJCV555RWN4yQkJGDmzJk6n5frIIDrIBCRdWJIuM+U6yCkZ101yDoI8vZNjFpfQ2AXAxGRlWJ3g+mZa6llc2BAICKyYgwJZCwMCEREVo4hwXTM8SwGc2FAICKyAQwJpmGOWQzmwoBARGQjGBLIkBgQiIhsCEOCkdlREwIDAhGRjWFIMB7OYiAiIqvGkEB1xYBARGSjGBIMj7MYiIjIJjAkGJYdDUFgQCAisnUMCQZkRwmBAYGIyA4wJJC+GBCIiOwEQ0LdcRaDGcyfPx8SiQSTJk1S7ysqKkJ0dDQaNGgAT09PDBw4ELm5uRqfy8nJQe/eveHu7g4/Pz9MnToVZWVlJq49EZF1YEioI0MMULSOfGAZAeHYsWP45JNP0KlTJ439kydPxo4dO7BlyxYcPHgQ165dw4ABA9Tvl5eXo3fv3igpKUFaWho2bNiApKQkxMfHm/oSiIisBkMC6cLsAaGgoADDhg3D2rVr4evrq96fn5+Pzz//HIsXL8Zzzz2HsLAwrF+/HmlpaThy5AgA4IcffsDZs2fx73//G6GhoejVqxfmzJmDlStXoqSkxFyXRERk8RgSaseOxiiaPyBER0ejd+/eiIiI0NifkZGB0tJSjf3t2rVDs2bNkJ6eDgBIT09Hx44d4e/vry4TGRkJpVKJM2fOmOYCiIisFENCLdhRQnAy58k3bdqEEydO4NixY1rvKRQKODs7w8fHR2O/v78/FAqFusyD4aDi/Yr3qlJcXIzi4mL1a6VSWdtLICKyahUh4c6xFeauClkYs7UgXLlyBRMnTsTGjRvh6upq0nMnJiZCKpWqt8DAQJOen4jIkrAlQXecxWACGRkZuHHjBjp37gwnJyc4OTnh4MGDWLZsGZycnODv74+SkhLk5eVpfC43NxcymQwAIJPJtGY1VLyuKFOZ2NhY5Ofnq7crV64Y9uKIiKwMQ4JuuNSyCfTo0QOnTp1CZmameuvSpQuGDRum/nO9evWQmpqq/kx2djZycnIgl8sBAHK5HKdOncKNGzfUZVJSUuDt7Y3g4OAqz+3i4gJvb2+NjYjI3jEk0IPMNgbBy8sLHTp00Njn4eGBBg0aqPePGjUKMTExqF+/Pry9vTFhwgTI5XI8+eSTAICePXsiODgYr7/+OhYsWACFQoEZM2YgOjoaLi4uJr8mIiJrxzEJ1TPEGEMraUAw/yyG6ixZsgQvvfQSBg4ciGeffRYymQzff/+9+n1HR0ckJyfD0dERcrkcr732GoYPH47Zs2ebsdZERNaNLQnVsKNZDBIhhDB3JcxNqVRCKpUi9698djcQEf0/a2lJUCqV8G8gRX6+8f4Nr/ieOHXpBry86naOu3eV6BjkZ9T6GoJFtyAQEZH5sCXBvjEgEBFRlRgSNElggFkM5r4IHTEgEBFRtRgS/seOhiAwIBARUc0YEuwPAwIREemEIYELJREREVWKIcF+OhkYEIiISC8MCfaBAYGIiPRmryGBXQxEREQ1sMeQYD8dDAwIRERUB/YYEuwFAwIREdWJPYUEdjEQERHpwV5CgsRA/1kDBgQiIjIIuwgJdjQIgQGBiIgMxi5Cgp1gQCAiIoOy5ZBgRw0IDAhERGR4thoSOEiRiIiojmw1JNgLBgQiIjIaWwsJnMVARERkIDYVEuxoEAIDAhERGZ1NhQQ7wYBAREQmYQshwY4aEBgQiIjIdKw9JHAWAxERkZFYe0iwFwwIRERkctYbEgwxg8E6mhAYEIiIyCysMSSwi4GIiMgErDEk2AsGBCIiMiuGBMvEgEBERGZnLSGBXQxEREQmZg0hgUstExERmYE1hAR7wYBAREQWxZJDArsYiIiIzMhSQwKXWiYiIjIzSw0J9oIBgYiILJbFhQQ7akJgQCAiIotmSSGBsxiIiIgsiCWFBHvBgEBERFbBEkICZzEQERFZIHOHBDsagsCAQERE1sWsIcFMCWHlypVo0aIFXF1dER4ejl9++aXa8lu2bEG7du3g6uqKjh07YteuXXqfkwGBiIisjrlbEkxp8+bNiImJQUJCAk6cOIGQkBBERkbixo0blZZPS0vD0KFDMWrUKJw8eRL9+/dH//79cfr0ab3OKxFCCENcgDVTKpWQSqXI/Ssf3t7e5q4OERHpyPfx8fgjdR78G0iRn2+8f8MrvicUt+p+DqVSCVlD3esbHh6Oxx9/HCtWrAAAqFQqBAYGYsKECZg+fbpW+cGDB6OwsBDJycnqfU8++SRCQ0OxZs0anevJFgQiIrJad46tQLN/vGuy85l6kGJJSQkyMjIQERGh3ufg4ICIiAikp6dX+pn09HSN8gAQGRlZZfmqOOlV2kZVNKLcVSrNXBMiItLXme3xaB20FqZoEFca4Hui4hgPH8vFxQUuLi4a+27duoXy8nL4+/tr7Pf398e5c+cqPb5Coai0vEKh0KueDAgA/vrrLwBA66BAM9eEiIhq6+7du5BKpUY5trOzM2QyGdoY6HvC09MTgYGax0pISMDMmTMNcnxDYEAAUL9+fQBATk6O0X64bJlSqURgYCCuXLnCMRy1wPtXN7x/dWML908Igbt37yIgIMBo53B1dcWlS5dQUlJikOMJISB5qK/h4dYDAGjYsCEcHR2Rm5ursT83NxcymazSY8tkMr3KV4UBAff7cwBAKpVa7f8glsDb25v3rw54/+qG969urP3+meKXO1dXV7i6uhr9PA9ydnZGWFgYUlNT0b9/fwD3BymmpqZi/PjKZ3HI5XKkpqZi0qRJ6n0pKSmQy+V6nZsBgYiIyILFxMQgKioKXbp0wRNPPIGlS5eisLAQI0eOBAAMHz4cTZo0QWJiIgBg4sSJ6NatGxYtWoTevXtj06ZNOH78OD799FO9zsuAQEREZMEGDx6MmzdvIj4+HgqFAqGhodizZ496IGJOTo66JRwAnnrqKXz11VeYMWMG/vWvf6FNmzbYtm0bOnTooNd5GRBwv98nISGh0v4fqhnvX93w/tUN71/d8P5Zh/Hjx1fZpXDgwAGtfa+++ipeffXVOp2TCyURERGRFi6URERERFoYEIiIiEgLAwIRERFpYUAgIiIiLQwI0P852/bg0KFD6NOnDwICAiCRSLBt2zaN94UQiI+PR+PGjeHm5oaIiAj8/vvvGmVu376NYcOGwdvbGz4+Phg1ahQKCgpMeBXmk5iYiMcffxxeXl7w8/ND//79kZ2drVGmqKgI0dHRaNCgATw9PTFw4ECt1c9ycnLQu3dvuLu7w8/PD1OnTkVZWZkpL8UsVq9ejU6dOqkX75HL5di9e7f6fd47/cyfPx8SiURj4RzeQ6qJ3QcEfZ+zbS8KCwsREhKClStXVvr+ggULsGzZMqxZswZHjx6Fh4cHIiMjUVRUpC4zbNgwnDlzBikpKUhOTsahQ4fw5ptvmuoSzOrgwYOIjo7GkSNHkJKSgtLSUvTs2ROFhYXqMpMnT8aOHTuwZcsWHDx4ENeuXcOAAQPU75eXl6N3794oKSlBWloaNmzYgKSkJMTHx5vjkkyqadOmmD9/PjIyMnD8+HE899xz6NevH86cOQOA904fx44dwyeffIJOnTpp7Oc9pBoJO/fEE0+I6Oho9evy8nIREBAgEhMTzVgrywJAbN26Vf1apVIJmUwmFi5cqN6Xl5cnXFxcxNdffy2EEOLs2bMCgDh27Ji6zO7du4VEIhFXr141Wd0txY0bNwQAcfDgQSHE/ftVr149sWXLFnWZrKwsAUCkp6cLIYTYtWuXcHBwEAqFQl1m9erVwtvbWxQXF5v2AiyAr6+v+Oyzz3jv9HD37l3Rpk0bkZKSIrp16yYmTpwohODPH+nGrlsQavOcbQIuXboEhUKhcd+kUinCw8PV9y09PR0+Pj7o0qWLukxERAQcHBxw9OhRk9fZ3PLz8wH878FgGRkZKC0t1biH7dq1Q7NmzTTuYceOHTUe2xoZGQmlUqn+TdoelJeXY9OmTSgsLIRcLue900N0dDR69+6tca8A/vyRbux6JcXaPGeboH6meHXPG1coFPDz89N438nJCfXr19f7meTWTqVSYdKkSejatat6qVOFQgFnZ2f4+PholH34HlZ2jyves3WnTp2CXC5HUVERPD09sXXrVgQHByMzM5P3TgebNm3CiRMncOzYMa33+PNHurDrgEBkCtHR0Th9+jQOHz5s7qpYlbZt2yIzMxP5+fn49ttvERUVhYMHD5q7WlbhypUrmDhxIlJSUkz+9EGyHXbdxVCb52wT1Pemuvsmk8m0BnqWlZXh9u3bdnVvx48fj+TkZOzfvx9NmzZV75fJZCgpKUFeXp5G+YfvYWX3uOI9W+fs7IzWrVsjLCwMiYmJCAkJwccff8x7p4OMjAzcuHEDnTt3hpOTE5ycnHDw4EEsW7YMTk5O8Pf35z2kGtl1QHjwOdsVKp6zre9zs+1JUFAQZDKZxn1TKpU4evSo+r7J5XLk5eUhIyNDXWbfvn1QqVQIDw83eZ1NTQiB8ePHY+vWrdi3bx+CgoI03g8LC0O9evU07mF2djZycnI07uGpU6c0glZKSgq8vb0RHBxsmguxICqVCsXFxbx3OujRowdOnTqFzMxM9dalSxcMGzZM/WfeQ6qRuUdJmtumTZuEi4uLSEpKEmfPnhVvvvmm8PHx0Ri5a4/u3r0rTp48KU6ePCkAiMWLF4uTJ0+KP/74QwghxPz584WPj4/4z3/+I/773/+Kfv36iaCgIPH333+rj/HCCy+Ixx57TBw9elQcPnxYtGnTRgwdOtRcl2RSY8eOFVKpVBw4cEBcv35dvd27d09d5u233xbNmjUT+/btE8ePHxdyuVzI5XL1+2VlZaJDhw6iZ8+eIjMzU+zZs0c0atRIxMbGmuOSTGr69Oni4MGD4tKlS+K///2vmD59upBIJOKHH34QQvDe1caDsxiE4D2kmtl9QBBCiOXLl4tmzZoJZ2dn8cQTT4gjR46Yu0pmt3//fgFAa4uKihJC3J/qGBcXJ/z9/YWLi4vo0aOHyM7O1jjGX3/9JYYOHSo8PT2Ft7e3GDlypLh7964Zrsb0Krt3AMT69evVZf7++28xbtw44evrK9zd3cXLL78srl+/rnGcy5cvi169egk3NzfRsGFDMWXKFFFaWmriqzG9N954QzRv3lw4OzuLRo0aiR49eqjDgRC8d7XxcEDgPaSa8HHPREREpMWuxyAQERFR5RgQiIiISAsDAhEREWlhQCAiIiItDAhERESkhQGBiIiItDAgEBERkRYGBCILMWLECPTv31/9+h//+AcmTZpk8nocOHAAEolEa53+B0kkEmzbtk3nY86cOROhoaF1qtfly5chkUiQmZlZp+MQkW4YEIiqMWLECEgkEkgkEvXDg2bPno2ysjKjn/v777/HnDlzdCqry5c6EZE++Lhnohq88MILWL9+PYqLi7Fr1y5ER0ejXr16iI2N1SpbUlICZ2dng5y3fv36BjkOEVFtsAWBqAYuLi6QyWRo3rw5xo4di4iICGzfvh3A/7oF5s6di4CAALRt2xYAcOXKFQwaNAg+Pj6oX78++vXrh8uXL6uPWV5ejpiYGPj4+KBBgwZ477338PCq5w93MRQXF2PatGkIDAyEi4sLWrdujc8//xyXL19G9+7dAQC+vr6QSCQYMWIEgPtPQExMTERQUBDc3NwQEhKCb7/9VuM8u3btwiOPPAI3Nzd0795do566mjZtGh555BG4u7ujZcuWiIuLQ2lpqVa5Tz75BIGBgXB3d8egQYOQn5+v8f5nn32G9u3bw9XVFe3atcOqVav0rgsRGQYDApGe3NzcUFJSon6dmpqK7OxspKSkIDk5GaWlpYiMjISXlxd++ukn/Pzzz/D09MQLL7yg/tyiRYuQlJSEdevW4fDhw7h9+za2bt1a7XmHDx+Or7/+GsuWLUNWVhY++eQTeHp6IjAwEN999x2A+4/svX79Oj7++GMAQGJiIr744gusWbMGZ86cweTJk/Haa6/h4MGDAO4HmQEDBqBPnz7IzMzE6NGjMX36dL3viZeXF5KSknD27Fl8/PHHWLt2LZYsWaJR5vz58/jmm2+wY8cO7NmzBydPnsS4cePU72/cuBHx8fGYO3cusrKyMG/ePMTFxWHDhg1614eIDMDMD4sismhRUVGiX79+Qoj7T7BMSUkRLi4u4t1331W/7+/vL4qLi9Wf+fLLL0Xbtm2FSqVS7ysuLhZubm5i7969QgghGjduLBYsWKB+v7S0VDRt2lR9LiE0n76XnZ0tAIiUlJRK61nx9M07d+6o9xUVFQl3d3eRlpamUXbUqFHqx27HxsaK4OBgjfenTZumdayHARBbt26t8v2FCxeKsLAw9euEhATh6Ogo/vzzT/W+3bt3CwcHB/UTBFu1aiW++uorjePMmTNH/QjiS5cuCQDi5MmTVZ6XiAyHYxCIapCcnAxPT0+UlpZCpVLhn//8J2bOnKl+v2PHjhrjDn799VecP38eXl5eGscpKirChQsXkJ+fj+vXryM8PFz9npOTE7p06aLVzVAhMzMTjo6O6Natm871Pn/+PO7du4fnn39eY39JSQkee+wxAEBWVpZGPQBALpfrfI4KmzdvxrJly3DhwgUUFBSgrKwM3t7eGmWaNWuGJk2aaJxHpVIhOzsbXl5euHDhAkaNGoUxY8aoy5SVlUEqlepdHyKqOwYEohp0794dq1evhrOzMwICAuDkpPm/jYeHh8brgoIChIWFYePGjVrHatSoUa3q4ObmpvdnCgoKAAA7d+7U+GIG7o+rMJT09HQMGzYMs2bNQmRkJKRSKTZt2oRFixbpXde1a9dqBRZHR0eD1ZWIdMeAQFQDDw8PtG7dWufynTt3xubNm+Hn56f1W3SFxo0b4+jRo3j22WcB3P9NOSMjA507d660fMeOHaFSqXDw4EFERERovV/RglFeXq7eFxwcDBcXF+Tk5FTZ8tC+fXv1gMsKR44cqfkiH5CWlobmzZvj/fffV+/7448/tMrl5OTg2rVrCAgIUJ/HwcEBbdu2hb+/PwICAnDx4kUMGzZMr/MTkXFwkCKRgQ0bNgwNGzZEv3798NNPP+HSpUs4cOAA3nnnHfz5558AgIkTJ2L+/PnYtm0bzp07h3HjxlW7hkGLFi0QFRWFN954A9u2bVMf85tvvgEANG/eHBKJBMnJybh58yYKCgrg5eWFd999F5MnT8aGDRtw4cIFnDhxAsuXL1cP/Hv77bfx+++/Y+rUqcjOzsZXX32FpKQkva63TZs2yMnJwaZNm3DhwgUsW7as0gGXrq6uiIqKwq+//oqffvoJ77zzDgYNGgSZTAYAmDVrFhITE7Fs2TL89ttvOHXqFNavX4/FixfrVR8iMgwGBCIDc3d3x6FDh9CsWTMMGDAA7du3x6hRo1BUVKRuUZgyZQpef/11REVFQS6Xw8vLCy+//HK1x129ejVeeeUVjBs3Du3atcOYMWNQWFgIAGjSpAlmzZqF6dOnw9/fH+PHjwcAzJkzB3FxcUhMTET79u3xwgsvYOfOnQgKCgJwf1zAd999h23btiEkJARr1qzBvHnz9Lrevn37YvLkyRg/fjxCQ0ORlpaGuLg4rXKtW7fGgAED8OKLL6Jnz57o1KmTxjTG0aNH47PPPsP69evRsWNHdOvWDUlJSeq6EpFpSURVo6KIiIjIbrEFgYiIiLQwIBAREZEWBgQiIiLSwoBAREREWhgQiIiISAsDAhEREWlhQCAiIiItDAhERESkhQGBiIiItDAgEBERkRYGBCIiItLCgEBERERa/g+fJcl/sguzjwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_matrix(confuse_matrix,title='test_set-confuse_matrix')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 错误类分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "faulse_cm = fault_cls(labels,pre_values)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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a2xlOlala5zHp37Brdr8v6eJpvpR9gcAwGTo+QMAIEluKPsblP0BAPAe7rjn7/psgdZB8gcAQOZK/tzzBwDAg7KystSnTx/5+/srNjZWn3zySaPHL168WAMHDlRAQIAiIiKUkpKiiooKp85J8gcAQPpxtL+rmxPWr1+v1NRUZWRkaM+ePYqOjlZCQoKOHz9e7/Hr1q3TnDlzlJGRof3792vVqlVav369fvWrXzl1Xo8m//fff1+jR49WeHi4LBaLNm/e7PC6YRhKT09Xjx49FBAQoPj4eH355ZeeCRYA0K6dK/u7ujlj0aJFmjp1qpKSkhQVFaXly5erU6dOWr16db3H79y5U9dff73uuece9enTR6NGjdLEiRObrBZcyKP3/MvLyxUdHa0HHnhA48aNq/P6s88+qyVLlujVV19V3759NXfuXCUkJOiLL76Qv7+/ByJ2xPxtNAc/C4D5lJWVOXxttVpltVod9lVVVamgoEBpaWn2fT4+PoqPj1d+fn697V533XX63//9X33yyScaPny4vvrqK23btk333XefU/F5NPnfcccduuOOO+p9zTAMLV68WE8++aTGjBkjSXrttdcUGhqqzZs36xe/+EVrhgoAaOfcOeAvIiLCYX9GRobmzZvnsO/kyZOqqalRaGiow/7Q0FAdOHCg3vbvuecenTx5UjfccIMMw9APP/yghx56yLvK/o05fPiwbDab4uPj7ftCQkIUGxvb4CciSaqsrFRZWZnDBgBAU9xZ9i8uLlZpaal9O79374odO3bomWee0dKlS7Vnzx69+eab2rp1qxYsWOBUO212qp/NZpOkej8RnXutPpmZmZo/f36LxgYAQGOCg4MVHBzc6DHdunWTr6+vSkpKHPaXlJQoLCys3vfMnTtX9913nx588EFJ0tVXX63y8nL98pe/1K9//Wv5+DSvT99me/4XKy0tzeHTVnFxsadDAgB4gdYe8Ofn56eYmBjl5uba99XW1io3N1dxcXH1vue7776rk+B9fX0lnb1d3lxttud/7lNPSUmJevToYd9fUlKiIUOGNPi++gZVAADQJA8s7JOamqrExEQNGzZMw4cP1+LFi1VeXq6kpCRJ0uTJk9WzZ09lZmZKkkaPHq1FixZp6NChio2N1cGDBzV37lyNHj3a/iGgOdps8u/bt6/CwsKUm5trT/ZlZWX6+OOP9fDD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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 错误类别混淆矩阵可视化\n",
    "plot_matrix(faulse_cm)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "## 请使用matplotlib等可视化库对你的实验结果进行可视化分析。\n",
    "## 包括但不限于准确率的对比、错误分类的分析、特征的影响等。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 7. 结果讨论\n",
    "讨论你的模型性能，尝试解释为什么某些模型比其他模型表现好，以及可能的改进方法。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 8. 保存模型（可选）\n",
    "如果需要，可以在这里添加代码保存你的模型。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
